![cURL 在输出和跟踪中显示不同的服务器响应数据:为什么?](https://linux22.com/image/1513247/cURL%20%E5%9C%A8%E8%BE%93%E5%87%BA%E5%92%8C%E8%B7%9F%E8%B8%AA%E4%B8%AD%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%93%8D%E5%BA%94%E6%95%B0%E6%8D%AE%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
运行以下命令后:
curl --data-binary @request.bin $URL --trace trace.txt > out.txt
输出文件不包含任何内容(其大小为零),但在跟踪.txt我可以读到(除其他外)这些:
<= Recv data, 5 bytes (0x5)
0000: 30 0d 0a 0d 0a 0....
我希望输出文件包含30 0d 0a 0d 0a
,或者至少不为空。我错在哪里?
NB:服务器的响应是“OK”:
<= Recv header, 17 bytes (0x11)
0000: 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
答案1
0d 0a 0d 0a
表示 2 次CR LF
,它是服务器和客户端之间 HTTP 对话交换的一部分,表示“http 会话结束”。我猜这里的零0....
对应于Content-Length: 0
标头,这意味着服务器返回了空回复。您可以看到它为空out.txt
。非空回复有什么原因吗,或者您也想捕获输出标头out.txt
?
答案2
30 0d 0a 0d 0a 这是从 HTTP 服务器到客户端的终止零消息。
在服务器使用“数据块”的情况下会发生这种情况:
HTTP 规范提供了两种方法来指定请求的结束位置。Content-Length 标头和 Transfer-Encoding 标头。
“Transfer-Encoding 标头用于指定消息主体使用分块编码。每个块由以字节为单位的块大小(十六进制)组成,后跟换行符,后跟块内容。消息以大小为零的块结束。”