Python requests传请求头访问XML接口返回400错误排查方案
错误排查与正确实现
现有代码的核心问题
- 参数名拼写错误:
requests.get接收请求头的参数是headers(复数形式),你写的是header(单数),参数名不匹配会导致你定义的所有自定义请求头根本没有被发送到服务端,接口校验不到要求的必填头,会直接返回400错误。 - 请求头配置不合理:
Content-Type是用来描述请求体数据格式的头,你发送的是GET请求,本身没有请求体,这个头属于多余配置;另外你需要获取XML格式的返回数据,要加Accept头明确告知服务端你可接收的响应格式为XML,避免服务端格式校验时拒绝请求。 - 手动设置
Host头容易触发错误:如果不是100%确认值完全正确,建议删掉这行配置,requests会自动根据你填写的URL生成匹配的Host头,手动写错域名、漏写端口都会触发400错误。
快速排查方法
修正参数后先不要直接写文件,先打印调试信息定位问题:
resp = requests.get(url, headers=header_details) # 打印实际发出的请求头,确认自定义头都已携带 print("实际发送的请求头:", resp.request.headers) # 打印响应正文,查看服务端返回的具体错误提示,不要只打印响应对象 print("响应状态码:", resp.status_code) print("响应内容:", resp.text)
如果打印的请求头里没有你定义的d/cot/pid字段,说明参数传递仍然有误;如果头信息都正常还是报错,就把代码里的请求头和能正常访问接口的工具(Postman、浏览器开发者工具)里的请求头逐一比对,排查是否漏了校验字段、是否存在值写错的情况。
完整可运行代码(含XML写入逻辑)
import requests url = '你的私有接口地址' header_details = { "d": "a45", "cot": "yuui", "pid": "1345", # 不确定Host配置是否正确就删掉下面这行,让requests自动填充 # "Host": "abc.vmp.com", "Accept": "application/xml, text/xml; charset=utf-8" } resp = requests.get(url, headers=header_details) # 状态码为200时再执行文件写入 if resp.status_code == 200: # 用二进制模式写入,避免编码问题导致XML乱码、格式损坏 with open("abc.xml", "wb") as f: f.write(resp.content) print("接口请求成功,XML内容已写入本地abc.xml文件") else: print(f"请求异常,状态码:{resp.status_code},服务端返回:{resp.text}")
注意:如果接口对请求头校验比较严格,不要随意添加多余头,也不要遗漏必填头,和正常访问场景下的请求头保持完全一致是最稳妥的。写入XML文件时不要用
resp.text转字符串后写入,直接存储二进制内容能规避编码识别错误导致的文件异常。
内容的提问来源于stack exchange,提问作者kiric8494
相关产品推荐
相关产品推荐

