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

如何在Go http服务器中解析http Get请求体?,http,go,Http,Go,在GoHTTP服务器中,我可以获得POST请求主体。Go net/http包似乎删除了GET请求主体。我知道最好不要使用,但我需要用请求体处理HTTPGET。是否可以不更改标准库? 请帮忙,因为我不想用libevent切换回C 当客户端发送带有请求正文的帖子时,下面的代码将显示正文内容。但是,当客户机发送带有请求主体的GET时,主体中没有任何内容 func handler(w http.ResponseWriter, r *http.Request) { defer r.Body.Clo

在GoHTTP服务器中,我可以获得POST请求主体。Go net/http包似乎删除了GET请求主体。我知道最好不要使用,但我需要用请求体处理HTTPGET。是否可以不更改标准库? 请帮忙,因为我不想用libevent切换回C

当客户端发送带有请求正文的帖子时,下面的代码将显示正文内容。但是,当客户机发送带有请求主体的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)
}

大部分魔法都发生在
transfer.go
中。以下是我在
fixLength
func中发现的相关内容:

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
}
看起来,只要你的客户在结束一个
内容长度
标题,你就一切都好。如果没有,库将假定
GET
请求中没有正文

当你的客户正在做一些非常不寻常/不完整的事情时,你有点偏离了地图的边缘。如果你能修复客户,那是你最好的选择

这就是说,如果你有一个客户你需要支持,而这个客户做得不对,你就必须自己做一些事情。您不需要一直到C和libevent。只需将标准库中的net/http包复制到您的项目中并对其进行修改。然后更改导入语句以指向库的版本


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

您“需要使用请求体处理http GET”?真正地您的设计可能有问题。我无法更改协议。我希望我能。你能发布一个你想要实现的代码的例子吗?很难理解你在问什么。我确实快速浏览了Go的net/http源代码,没有发现类似“如果这是一个GET,就扔掉尸体”这样的东西。服务器响应有一些预期的条件,比如如果method是HEAD,或者如果状态代码<200、204或304,那么对于客户端请求,我没有看到任何结果。你绝对确定是客户送来了尸体吗?比如用Fiddler之类的工具检查请求?有人应该编辑库,使它符合要求,即使它是一个不常见的用例。你是对的。GET未指定内容长度时,r.Body是一个eofReader(eofReader是一个始终返回EOF的非nil io.ReadCloser)。