2016-03-27 11 views
-1

私はgolangのhttpリクエストからデータを取得しようとしています。私はnet/httpパッケージを使用しています。私のサーバハンドラでは、r.Bodyからデータを取得しようとしています。golangの標準的な方法でhttpリクエストからデータを取得する方法は?

body, err := ioutil.ReadAll(r.Body) 
if err != nil { 
    log.Printf("FATAL IO reader issue %s ", err.Error()) 
} 

いくつかの入力データでサービスをカールするとうまく動作します。

curl --data '{"AppName":"Proline","Properties":null,"Object":"","Timestamp":"2016:03:27 00:08:11"}' -XGET http://localhost:8081/api/services/test/ 

しかし、このサービスをajax呼び出しから呼び出そうとすると、r.Bodyは空です。

requestJSON = '{"AppName":"Proline","Properties":null,"Object":"","Timestamp":"2016:03:27 00:08:11"}' 
$.ajax({ 
    type: "GET", 
    url: "http://localhost:8081/api/services/test/", 
    data: requestJSON, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){alert(data);}, 
    failure: function(errMsg) { 
     alert(errMsg); 
    } 
}); 

だから私はr.Form

r.ParseForm() 
var body []byte 
for key, _ := range r.Form { 
    body = []byte(key) 
    break 
} 

からの入力データを読み込むように変更しかし、今カール要求は失敗します。 golangのhttpリクエストから入力データを取得する標準的な方法はありますか?私はGo 1.6を使用しています。誰かが私にこれを手伝ってもらえますか?

+0

あなたはPOSTとして送信しようとしたことがありますか? –

+0

@Not_a_Golfer - POSTは 'r.Form'で正常に動作しています。 GETでデータを送信することはできませんか?[それは良い方法ではないかもしれません]。 – Dany

+0

本文付きのhttp GETリクエストは珍しいです。私は仕様にも反対していると思う。だから私はあなたのブラウザはそれを許可していないと思う。はい、良い習慣ではありません。 POSTを使用します。 –

答えて

2

GET要求で意味のある本文を送信することは、この仕様では許可されていません。だからあなたのブラウザは空のボディを送信している可能性があります。代わりにPOSTを使用できます。その本体がapplication/x-www-form-urlencodedでエンコードされることを期待しているので、r.ParseForm()は機能しません。 Not json

サーバーのリクエストハンドラにユーザー入力を送信する方が適切な場合は、urlクエリパラメータを使用できます。 データパラメータのJQuery.ajax()docsを引用

データがサーバに送信されます。 がまだ文字列でない場合は、クエリ文字列に変換されます。これはGETリクエストのURLに追加されています。この自動処理を防止するには、 processDataオプションを参照してください。オブジェクトは キー/値のペアでなければなりません。

だからあなたは行うことができ、

$.ajax({ 
    type: "GET", 
    url: "http://localhost:8081/api/services/test/", 
    data: {AppName: "Proline", Properties:null, Object: ""}, // An object, not a string. 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){alert(data)} 
}) 

は、サーバーでアン、

params := r.URL.Query() 
params.Get('AppName') // returns 'Proline' 

は、ドキュメントを参照してください:https://golang.org/pkg/net/url/#URL.Query

関連する問題