Python中代码和API调试工具返回结果不同的原因与解决方法
我在使用百度统计 API 的过程中发现同样请求参数的情况下,代码返回的结果和 API 调试工具返回的结果不同。
通过 API 工具(我用的是 Insomia )请求时能返回正常结果,但用代码请求时,日期参数不能正常生效。
日期参数格式、类型都正确,不知道问题出在哪里,求解
代码请求
def getresult(start, end, method, metrics, **kw):
base_url = "https://api.baidu.com/json/tongji/v1/ReportService/getData"
body = {"header": {"account_type": 1, "password": "", "token": "", "username": ""},
"body": {"siteId": siteId, "method": method, "start_date ": start, "end_date": end, "max_results": 0, "metrics": metrics, "gran": "day"}}
for key in kw:
body['body'][key] = kw[key]
data = json.dumps(body)
res = requests.post(base_url, data)
res = json.loads(res.text)
return res
通过代码请求返回的结果如下图

虽然传入的日期是 20190119 ,但返回的数据日期是默认的 20190121 (当天) ,等于日期参数没生效
API 工具请求
同样参数,返回结果则正常

Python中代码和API调试工具返回结果不同的原因与解决方法
两个的请求参数肯定有不一样的地方 注意请求头
用 charles 模拟
帖子标题问的是代码和API调试工具返回结果不同,这问题我遇到过。核心原因就几个,我给你直接说清楚。
1. 请求本身就不一样
这是最常见的情况。你用Python的requests发请求,和你用Postman、浏览器调试工具发请求,看着地址一样,但细节可能差远了。
- 请求头(Headers):工具可能自动帮你加
User-Agent、Accept、Content-Type,甚至Cookie。你的代码如果没加,服务器返回的内容就可能不同。 - 参数格式:工具里你填
form-data、x-www-form-urlencoded还是raw JSON,对应到代码里是完全不同的写法。用错了格式,服务器可能直接报错或返回默认结果。 - Cookies/Session:浏览器和工具可能带着登录状态的Cookie,你的代码如果是新会话,没处理登录,返回的自然是未授权或不同的数据。
2. 环境与上下文差异
- IP/User-Agent被风控:有些API会限制非浏览器的访问,或者对频繁请求的IP返回验证页面。你的代码可能因此拿到的是验证码或错误页的HTML,而不是工具里看到的JSON数据。
- HTTPS/证书问题:工具可能忽略SSL证书验证,而你的代码如果没设置
verify=False,可能会因为证书问题请求失败。 - 重定向:工具自动跟随重定向,而你的代码可能需要手动处理(
allow_redirects=True)。
怎么解决?一个字:对。
第一步:确保请求“一模一样” 别猜。用工具(如Postman)成功发起一次请求,然后直接看它生成的代码。以Postman为例,点那个 “Code” 按钮,选择 “Python - Requests”,它会给你生成几乎完全等效的代码片段。把这个代码和你自己的对比,差异一目了然。
第二步:关键检查点 对比生成代码和你自己的代码,重点看:
headers是否完全一致(特别是Content-Type,User-Agent,Authorization)。data和json参数用对了没?表单数据用data,JSON数据用json。cookies或session是否需要。- URL是否完全一致(有没有多余的空格或编码问题)。
第三步:让代码“看到”工具看到的东西 在你的代码里,关键位置(发送请求前、收到响应后)把信息打印出来,和工具里的“原始请求”对比。
import requests
import json
# 准备你的请求
url = 'https://api.example.com/data'
headers = {'User-Agent': 'my-app/1.0'}
payload = {'key': 'value'}
# 打印即将发送的请求详情(模拟工具视角)
print("=== 请求URL ===")
print(url)
print("\n=== 请求头 ===")
for k, v in headers.items():
print(f"{k}: {v}")
print("\n=== 请求体 ===")
print(json.dumps(payload, indent=2))
# 发送请求
resp = requests.post(url, headers=headers, json=payload)
# 打印收到的原始响应详情
print("\n=== 响应状态码 ===")
print(resp.status_code)
print("\n=== 响应头 ===")
for k, v in resp.headers.items():
print(f"{k}: {v}")
print("\n=== 响应体 (前500字符) ===")
print(resp.text[:500])
把上面打印的 URL、请求头、请求体 和工具里 “Raw” 或 “Code” 视图的内容逐行对比。再把打印的 响应状态码、响应头、响应体 和工具的 Response 对比。不一样的地方,就是问题所在。
总结:问题几乎总是出在请求的细节上,用工具生成代码进行逐项比对是最快的方法。
"start_date ": start, “end_date”: end, 多了个空格
请求参数不一样,具体可以看两个请求的 header,目测 content-type 不一样,一个 form,一个 json
感谢…确实没注意到,一直在看是不是参数名拼写错了、格式是不是不对,万万没想到
感谢两位,我尝试单独构造过 header 再请求,结果一样的。
实际原因是 2L samcode 兄弟说的空格问题[扶额]
非常抱歉打扰大家了

