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

时间:2013-07-16 12:19:10

标签: http go

在Go http服务器中,我可以获得POST请求正文。 go net / http包似乎删除了GET请求体。我知道最好不要使用http GET with request body,但我需要处理请求正文的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 个答案:

答案 0 :(得分:3)

大多数魔法发生在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
}

看起来,只要您的客户端正在结束Content-Length标题,您就会很好。如果没有,图书馆将认为GET请求中没有正文。

当你的客户正在做一些非常不寻常/破碎的东西时,你有点偏离地图的边缘。如果你可以修理客户,这是你最好的选择。

那就是说,如果你有一个客户,你需要支持这样做错了,你将不得不自己滚动一些东西。你不需要一直到C和libevent。只需将net / http软件包从标准库复制到项目中并进行修改即可。然后将导入语句更改为指向您的库版本。

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