You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:36:01