我目前正在创建一个 python 套接字 http 服务器,并且我正在处理我的 GET 和 POST 请求。我的 GET 实现工作正常,但 POST 请求的 body 元素不会显示。 代码片段:
self.host = ''
self.port = 8080
self.listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.listener.bind((self.host, self.port))
self.listener.listen(1)
while True:
client_connection, client_address = self.listener.accept()
request = client_connection.recv(2048)
print request
此代码在处理来自网页的发布请求后生成 http header :
POST /test.txt HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Origin: http://localhost:8080
Content-Length: 21
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17
Referer: http://localhost:8080/
Accept-Language: nb-no
Accept-Encoding: gzip, deflate
但是没有正文,所以问题是为什么我知道它已发送但没有收到 http 正文?
谢谢!
最佳答案
while True:
client_connection, client_address = self.listener.accept()
request = client_connection.recv(2048)
print request
recv
不完全读取 2048 字节,但最多读取 2048 字节。如果一些数据到达,即使后面可能有更多数据,recv
也会与数据一起返回。我的猜测是,在您的情况下,客户端首先发送 HTTP header ,然后发送正文。如果 NAGLE 算法在客户端关闭(常见),则您的第一个 recv
可能只会获取 header ,而您需要另一个 recv
来获取正文。这将解释你的情况发生了什么:你得到了标题而不是正文,因为你没有做另一个 recv
。
但即便如此,实现起来也过于简单,迟早会出错。要使其正确,您应该正确实现 HTTP 协议(protocol):首先读取 HTTP header ,如果 header 很大,则可能需要多个 recv
。然后您应该解析 header ,计算出正文的大小(Content-length
header )并读取剩余的字节。
关于python - 未收到 http POST 消息正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39518577/