如何在golang中以标准方式从http请求中获取数据?

时间:2016-03-27 14:27:19

标签: ajax http curl go

我正在尝试从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。有人可以帮我这个吗?

1 个答案:

答案 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'

请参阅文档:https://golang.org/pkg/net/url/#URL.Query