0

客户

Python 版本 - 3.9,Python 请求模块版本 - 2.25

服务器

Java 13,雄猫 9。

我有一个基于 Tomcat+Java 的服务器公开 REST API。我正在用 python 编写一个客户端来使用这些 API。一切都很好,直到我在 POST 请求中发送空正文。这对我们来说是一个有效的用例。如果我发送空正文,则会收到 400 bad request error - Invalid character found in method name [{}POST]。HTTP 方法名称必须是标记。如果我从 POSTMAN 或 Java 或 CURL 发送空请求,它工作正常,只有当我使用 python 作为客户端时才会出现问题。

以下是python片段 -

json_object={}
header = {'alias': 'A', 'Content-Type' : 'application/json', 'Content-Length' : '0'} 
resp = requests.post(url, auth=(username, password), headers=header, json=json_object) 

我也尝试使用数据而不是json参数来发送有效负载,但没有取得多大成功。

我捕获了wireshark转储以进一步了解它,发现收到的请求tomcat不符合RFC2616(https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html)。尤其是部分 - Request-Line = Method SP Request-URI SP HTTP-Version CRLF 因为我可以从 Wireshark 转储中看到它看起来像 - {}POST MY-APP-URI HTTP/1.1

正如我们所见,空的主体以 http-method 为前缀,因此 tomcat 将其报告为错误。然后我查看了python http库代码-client.py。以下是相关细节——

文件-client.py

方法 - _send_output(从第 1001 行开始) - 它首先在第 1010 行发送标题,然后在代码中的某处发送正文。我想(我在这里可能是错的)也许在这种情况下,标头比主体 2 个字节长 310 个字节,所以当完整的标头在线发送时,主体被推送,因此 TCP 帧的顺序是这样的,即主体出现第一的。为了证实这一点,我在发送标题行#1011 和宾果游戏后添加了 1 秒的延迟,错误消失了,它开始正常工作。不确定这是否是完全正确的分析,但知道的人可以确认或让我知道如何解决这个问题。

4

0 回答 0