为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go http 服务器中解析 http Get 请求正文?

如何在 Go http 服务器中解析 http Get 请求正文?

Go
芜湖不芜 2021-06-16 17:01:36
在 Go http 服务器中,我可以获得 POST 请求正文。Go net/http 包似乎删除了 GET 请求正文。我知道最好不要将http GET 与请求正文一起使用,但我需要使用请求正文处理 http GET。是否可以不更改标准库?请帮忙,因为我不想用 libevent 切换回 C!当客户端发送带有请求正文的 POST 时,下面的代码将显示正文内容。但是当客户端发送带有请求正文的 GET 时,正文中没有任何内容。func handler(w http.ResponseWriter, r *http.Request) {    defer r.Body.Close()    body, _ := ioutil.ReadAll(r.Body)    log.Printf("body: %v", string(body))}func main() {    http.HandleFunc("/", handler)    http.ListenAndServe(":8080", nil)}
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

大多数魔法发生在transfer.go. 这是我发现在fixLengthfunc中看起来相关的内容:


if !isResponse && requestMethod == "GET" {

    // RFC 2616 doesn't explicitly permit nor forbid an

    // entity-body on a GET request so we permit one if

    // declared, but we default to 0 here (not -1 below)

    // if there's no mention of a body.

    return 0, nil

}

看起来,只要你的客户结束一个Content-Length标题,你就一切都好。如果没有,图书馆将假定GET请求中没有正文。


你有点偏离地图的边缘,因为你的客户正在做一些非常不寻常/破碎的事情。如果你能修复客户端,那是你最好的选择。


也就是说,如果你有一个需要支持的客户,但他做错了,你将不得不自己解决一些问题。您不需要一直深入到 C 和 libevent。只需将标准库中的 net/http 包复制到您的项目中并进行修改。然后更改您的导入语句以指向您的库版本。


或者,如果您知道客户端没有使用 keep-alive,您可以Hijack连接并读取套接字上剩余的任何内容。


查看完整回答
反对 回复 2021-06-21
  • 1 回答
  • 0 关注
  • 247 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信