You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

调用API获取JSON遇JSONDecodeError,添加filter参数出错求助

解决JSONDecodeError: Expecting value错误的排查步骤

首先,这个错误的核心原因是服务器返回的不是有效的JSON内容——可能是空响应、HTML错误页面,或者纯文本提示。结合你的情况:不加filter参数时请求正常,加了就出错,大概率是请求参数的传递方式有问题,或者服务器返回了错误状态码。下面一步步来解决:

1. 先修正GET请求的参数传递方式

你当前的代码存在两个关键问题:

  • http.client.HTTPSConnection.request的第三个参数是请求体(body),GET请求不需要请求体,headers应该作为第四个参数传入;
  • GET请求的查询参数(比如filter)必须拼在URL路径后面,而不是放在请求体里。

修正后的代码如下:

import http.client
import codecs
import json

conn = http.client.HTTPSConnection("api.xxxx.com.tr")
headers = { 'accept': "application/json", 'apikey': "cd6b6c96799847698d87dec9f9a731d6" }
filter_param = "daily"
# 将filter参数拼接到URL的查询字符串中
request_url = f"/v1/articles?filter={filter_param}"
# GET请求无body,第三个参数留空,headers放在第四个参数位置
conn.request("GET", request_url, "", headers=headers)

reader = codecs.getreader("utf-8")
res = conn.getresponse()

# 先打印响应状态码和原始内容,排查问题根源
print(f"响应状态码: {res.status}")
raw_content = res.read().decode('utf-8')
print(f"原始响应内容: {raw_content}")

# 仅在状态码正常时解析JSON
if res.status == 200:
    data = json.loads(raw_content)
    print(json.dumps(data))
    return data
else:
    print(f"请求失败,服务器返回状态码: {res.status}")

2. 根据服务器返回内容定位问题

运行修正后的代码后,你能看到两个关键信息:

  • 如果状态码是400/401/404这类错误码:说明请求参数格式错误、权限不足或者路径无效,服务器返回的是HTML错误页面而非JSON,这直接导致了解码失败;
  • 如果状态码是200但内容为空:可能是服务器处理filter参数时出现内部错误,返回了空响应。

3. 其他可能的排查点

  • 验证filter参数的合法性:确认"daily"是API文档中允许的枚举值(有些API对参数大小写或格式有要求,比如是否需要写成"Daily");
  • 处理特殊字符:如果filter参数包含特殊字符,需要用urllib.parse.quote()进行URL编码,示例:
    import urllib.parse
    filter_param = urllib.parse.quote("daily")
    

总结

最可能的原因是你之前没有正确传递filter参数(GET参数必须拼在URL中),同时headers的参数位置错误也可能导致服务器处理请求异常。先修正请求方式,再查看服务器返回的原始内容,就能快速定位并解决问题。

内容的提问来源于stack exchange,提问作者darkfolcer

火山引擎 最新活动