调用GET接口时r.json()触发JSON Decode Exception,求解决方案
解决JSON Decode Exception问题
你的代码如下:
import requests import json URL = "http://127.0.0.1:8000/TESTGET_api/" def get_data(id = None): data = {} if id is not None: data = {'id':id} json_data = json.dumps(data) r = requests.get(url= URL, data = json_data ) data = r.json() print(data) get_data()
触发JSON Decode Exception的核心原因有两个:
- GET请求的规范是通过URL查询参数传递数据,而非请求体。你用
data参数传入JSON字符串,后端可能无法正确解析这个请求,导致返回非JSON格式的响应(比如错误页面、空内容)。 - 即使后端支持GET请求读请求体,你也没设置
Content-Type: application/json请求头,requests默认会把data参数的内容当成表单数据发送,后端同样无法识别为JSON。
解决方案
方案1:用查询参数传递数据(推荐,符合REST规范)
把id放在URL的查询字符串里,不需要JSON序列化,这是GET请求传递参数的标准方式:
import requests URL = "http://127.0.0.1:8000/TESTGET_api/" def get_data(id=None): params = {'id': id} if id else {} r = requests.get(url=URL, params=params) # 先检查请求是否成功,再解析JSON print(f"响应状态码: {r.status_code}") print(f"响应内容: {r.text}") try: data = r.json() print(data) except Exception as e: print(f"JSON解析失败原因: {str(e)}") get_data()
方案2:强制发送JSON格式的GET请求体(不推荐)
如果后端明确要求GET请求携带JSON请求体,需要手动设置请求头:
import requests import json URL = "http://127.0.0.1:8000/TESTGET_api/" def get_data(id=None): data = {'id': id} if id else {} json_data = json.dumps(data) headers = {'Content-Type': 'application/json'} r = requests.get(url=URL, data=json_data, headers=headers) print(f"响应状态码: {r.status_code}") print(f"响应内容: {r.text}") try: data = r.json() print(data) except Exception as e: print(f"JSON解析失败原因: {str(e)}") get_data()
调试建议
- 先看
r.status_code:如果是4xx(比如400、404)或5xx,说明请求本身就失败了,后端返回的不是JSON,而是错误页面或提示文本,这时候要先排查后端接口是否正常,或者请求参数是否符合要求。 - 用
r.text代替r.content:r.text会自动把字节内容解码为字符串,更直观看到返回的实际内容(比如是不是HTML错误页、空字符串)。
内容的提问来源于stack exchange,提问作者Misbah Aziz
相关产品推荐
相关产品推荐

