我正在使用HTTP
套接字发送POST
python
个请求:
import socket
s = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4001))
s.send(b'POST /session HTTP/1.1\r\nContent-Type:application/json\r\nUser-Agent: test/1\r\n\r\n{"desiredCapabilities": {}, "capabilities":{}}')
response = s.recv(10000)
print(response)
输出:
b'HTTP/1.1 200 OK\r\ncontent-length: 270\r\nContent-Type: application/json; charset=utf-8\r\nConnection: close\r\n\r\n{"sessionId":"72418bd14689c1cd9ee48706eada96a4","status":33,"value":{"message":"session not created exception: Missing or invalid capabilities\\n (Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Linux 4.4.0-91-generic x86_64)"}}'
输出摘要 - 返回错误消息,指出我尝试发送的json
对象丢失或不正确。
这就是我决定捕获请求的原因
mitmproxy
。
它没有内容,但它应该包含以下json
内容:
{"desiredCapabilities": {}, "capabilities":{}}
我无法理解问题所在。我遵循了HTTP
规范 - 在每个标题之后我放了CRLF
(\r\n
),在最后一个标题(用户代理)之后我添加了CRLF
,因为必须有1个身体内容前的空行。
请求/状态行和标题必须以
<CR><LF>
结尾(即a 回车后跟换行)。空行必须包含 只有<CR><LF>
而没有其他空格。
答案 0 :(得分:1)
您发送的POST请求缺少Content-length
标头,即您发送的请求无效。由于缺少Content-length
标题,服务器可能无法知道正文结束的位置,并且可能认为根本没有正文,即远离预期。这也反映在您的评论中:“在摘要响应中表示缺少json对象”。
我建议使用现有的HTTP库,而不是尝试直接使用套接字。 HTTP比大多数开发人员想象的要复杂得多。