JS Fetch转Python Requests调用API时遇JSON解析错误求助
API JSON解析错误排查及解决方法
问题背景
将官方提供的JavaScript Fetch API调用示例转换为Python Requests代码后,调用接口返回{'error': 'Unexpected token o in JSON at position 1'}错误,无法获取预期的JSON格式响应。
官方JavaScript示例代码
const request = await fetch("https://api.tiktokenizer.dev/openai", { headers: { Authorization: "Bearer <OPENAI_API_KEY>" }, method: "POST", body: JSON.stringify({ email: "<APP_USER_EMAIL>", appId: "<APPID>", developerKey: "<KEY>", model: "gpt-3.5-turbo", messages: [ { role: "user", content: "Hey ChatGPT, what's the capital of Portugal?", }, ], }), }); const response = await request.json();
转换后的Python Requests代码
import requests url = "https://api.tiktokenizer.dev/openai" headers = {"Authorization": "Bearer <OPENAI_API_KEY>"} data = { "email": "<APP_USER_EMAIL>", "appId": "<APPID>", "developerKey": "<KEY>", "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hey ChatGPT, what's the capital of Portugal?", }, ], } response = requests.post(url=url, headers=headers, json=data) print(response.json())
错误信息
{'error': 'Unexpected token o in JSON at position 1'}
预期响应格式
{ "message": "The capital of Portugal is Lisbon.", "usage": { "totalTokens": 25 }, "newUserCreated": false }
错误原因分析
这个JSON解析错误通常说明API返回的不是合法的JSON格式内容,常见诱因包括:
- API返回了纯文本错误信息(例如"OK"、权限提示等非JSON字符串),但
response.json()强制解析为JSON导致失败 - 请求头缺失必要的
Content-Type声明,API无法正确处理请求体,返回异常内容 - 请求参数(如API密钥、appId、邮箱)填写错误,API返回非JSON格式的错误提示
解决步骤
1. 先查看API返回的原始内容
在尝试解析JSON前,先打印响应状态码和原始文本,确认返回内容的实际格式:
import requests url = "https://api.tiktokenizer.dev/openai" headers = {"Authorization": "Bearer <OPENAI_API_KEY>"} data = { "email": "<APP_USER_EMAIL>", "appId": "<APPID>", "developerKey": "<KEY>", "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hey ChatGPT, what's the capital of Portugal?", }, ], } response = requests.post(url=url, headers=headers, json=data) # 打印状态码和原始响应内容 print("响应状态码:", response.status_code) print("原始响应内容:", response.text) # 安全尝试解析JSON try: print("解析后的JSON:", response.json()) except Exception as e: print("JSON解析失败原因:", str(e))
2. 显式添加Content-Type请求头
尽管Requests的json=data参数会自动添加Content-Type: application/json,但部分API要求显式声明该头,手动补充:
headers = { "Authorization": "Bearer <OPENAI_API_KEY>", "Content-Type": "application/json" }
3. 验证请求参数有效性
逐一检查<OPENAI_API_KEY>、<APP_USER_EMAIL>、<APPID>、<KEY>是否填写正确:
- API密钥是否完整,且保留
Bearer前缀 - appId、developerKey是否与开发者后台提供的一致
- 邮箱格式是否符合要求
4. 捕获解析异常,兼容非JSON响应
如果API确实返回非JSON格式的错误信息,通过异常捕获避免程序崩溃:
try: result = response.json() except ValueError: print("API返回非JSON内容:", response.text) else: print(result)
内容的提问来源于stack exchange,提问作者Mdogdope
相关产品推荐
相关产品推荐

