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

问题描述:

在Go http服务器中,我可以获得POST请求体。去净/ http包似乎删除GET请求体。我知道最好不要使用http GET with request body,但我需要处理带请求主体的http GET。有没有可能不改变标准库? 请帮忙,因为我不想用libevent切换回C!如何解析http在Go http服务器中获取请求正文?

当客户端发送带请求正文的POST时,以下代码将显示正文内容。但是当一个客户端发送一个包含请求正文的GET时,正文中没有任何内容。

​​
+0

你“**需要**来处理带请求体的http GET”吗?真的吗?您的设计中可能存在问题。 –

+0

我无法更改协议。我希望我能。 – gosharplite

+0

你可以发表一个你想*实现的代码的例子吗?很难理解你在问什么。 – elithrar

大部分的魔法发生在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软件包复制到您的项目中并修改即可。然后更改您的导入语句以指向您的图书馆版本。或者,如果您知道客户端未使用保持活动状态,则可以连接该连接并只读取套接字上剩下的任何内容。

+0

你是对的。当GET没有指定Content-Length时,r.Body是一个eofReader(eofReader是一个非零的io.ReadCloser,它总是返回EOF)。 – gosharplite