Python requests请求返回200偶发JSONDecodeError报错根因咨询
报错根因与解决方案
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 错误的核心是requests拿到的响应正文不符合JSON格式要求,且正文首字符就不满足JSON语法规范,HTTP状态码为200仅代表请求链路连通,和返回内容是否合法无关。
常见偶发报错根因
- 请求头未正确设置
Content-Type: application/json,服务端无法正确解析POST请求的JSON格式参数,偶发返回非JSON格式的错误提示,即使状态码为200 - 接口偶发返回空响应体:服务端逻辑异常、瞬时过载时,可能返回状态码200但响应正文为空,没有任何可解析的JSON内容
- 接口返回非JSON格式内容:偶发场景下服务端/中间代理/网关可能返回纯文本错误提示、HTML错误页等非JSON内容,比如瞬时限流提示、服务降级提示,这类内容首字符不是JSON要求的
{或[,直接触发解析错误 - 响应编码不匹配:接口返回的JSON使用了非UTF-8编码(比如GBK、GB2312),且未在响应头中声明正确编码,requests默认用UTF-8解码后产生乱码,导致首字符不符合JSON语法
- 网络传输异常:中间代理、网络波动导致响应体被截断,拿到的内容不完整,首段内容丢失无法解析
排查方法
在异常捕获块中打印完整的响应信息即可定位具体原因,代码示例:
import sys import requests import json response = requests.post(url=url, data=json.dumps(data), headers=headers) try: data_dict = response.json() except: # 打印关键信息定位问题 print(f"响应状态码:{response.status_code}") print(f"响应头Content-Type:{response.headers.get('Content-Type')}") print(f"响应正文前100字符:{response.text[:100]}") print(sys.exc_info())
优化方案
- 请求头补充
Content-Type: application/json配置,保证服务端能正确识别请求体格式 - 解析前增加前置校验,优先判断Content-Type是否为JSON类型、响应正文是否为空
- 手动指定响应编码匹配服务端实际编码,比如
response.encoding = 'utf-8' - 针对偶发异常增加重试机制,对JSON解析错误的场景设置最多3次重试,覆盖瞬时网络、服务端波动问题
- 针对非预期返回的场景增加兜底逻辑,避免程序直接崩溃
内容的提问来源于stack exchange,提问作者Sarvendra Singh
相关产品推荐
相关产品推荐

