Python发送POST请求无法传递Content-Type头且返回内容为空如何解决
问题原因
你遇到的404错误核心是Python构造的请求和Insomnia成功请求的头信息不完全匹配,目标站点的Nginx配置对请求头校验较严格,缺失必要头或者头内容不符合要求就会直接返回404。
你手动指定Content-Type的操作本身没有问题,但只传这一个头无法匹配服务端的校验规则,且手动写头容易出现拼写、格式错误。
解决方案
步骤1:复制Insomnia成功请求的全量头信息
打开Insomnia里的成功请求,把Headers标签下所有非自动生成的头(包括User-Agent、Accept、Accept-Encoding等)全部复制,不要只传Content-Type。
步骤2:修改Python代码,不要手动指定Content-Type
requests库传入data参数时会自动生成正确的application/x-www-form-urlencoded头,无需手动声明,避免人为书写错误。修改后的参考代码如下:
import requests payload = {'accountID': '20176429'} # 替换成你从Insomnia复制的所有头信息 headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive" } response = requests.post( "https://www.simplicialsoftware.com/api/account/GetPlayerProfile", data=payload, headers=headers ) print(response.status_code, response.reason) print(response.text[:300] + '...')
可选验证步骤
如果修改后还是返回404,可以开启requests的debug日志,对比Python发出的请求和Insomnia请求的差异:
import logging import http.client http.client.HTTPConnection.debuglevel = 1 logging.basicConfig(level=logging.DEBUG)
运行后可以在控制台看到完整的请求头、请求体内容,和Insomnia的请求逐一比对即可定位差异。
极端情况排查
如果以上操作都无效,检查本地是否开启了全局代理,导致Python请求被代理拦截转发到了错误的节点;可以在请求中添加proxies={"http": None, "https": None}参数强制不走代理测试。
内容的提问来源于stack exchange,提问作者di0n
相关产品推荐
相关产品推荐

