我正在尝试从golang中获取http请求中的数据。我正在使用net / http包。在我的服务器处理程序中,我试图从r.Body获取数据
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
}
但是现在curl请求失败了。有没有一种标准方法从golang中的http请求中检索输入数据?我正在使用Go 1.6。有人可以帮我这个吗?
答案 0 :(得分:2)
规范不允许使用GET请求发送有意义的正文。所以你的浏览器可能发送一个空的身体。您可以改用POST。毫不奇怪,r.ParseForm()
无效,因为它期望身体由application/x-www-form-urlencoded
编码。不是json
。
如果GET更适合将用户输入发送到服务器的请求处理程序,则可以使用url查询参数。
为数据参数引用JQuery.ajax()docs,
要发送到服务器的数据。它被转换为查询字符串if 还不是一个字符串。它附加到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'