排查返回400响应的Payload错误及JSONDecodeError问题
Pendo API调用400错误及JSONDecodeError排查
问题
调用Pendo API时持续返回400响应,同时触发JSONDecodeError("Expecting value", s, err.value) from None错误。推测Payload数据格式存在问题,但移除循环后脚本可正常运行,需排查Payload中的错误。
原代码
API_Key = os.getenv("API_Key") url = "https://app.pendo.io/api/v1/aggregation" dates = pd.date_range(start='1/1/2022', end='10/1/2022', freq='M').strftime("%Y-%m-%d").tolist() list_epoch=[] for i in dates: epoch = int(time.mktime(time.strptime(i, "%Y-%m-%d"))) list_epoch.append(epoch) days = [31,28,31,30,31,30,31,31,30,31,30,31,31,28,31,30,31,30,31,31,30] for var1, var2 in zip(list_epoch,days): data_payload = { "response": { "mimeType": "application/json" }, "request": { "pipeline": [ { "source": { "events":{ "featureId": "iNdfepY576Yo-x1itQUp5T99z8Y" }, "timeSeries": { "first": var1, "count": -var2, "period": "dayRange" } } } ] } } print(data_payload) headers = { 'x-pendo-integration-key': API_Key, 'content-type': "application/json" } response = requests.post(url, json=data_payload, headers=headers) print(response) response_dictionary = json.loads(response.content)
排查及修复方案
1. timeSeries参数格式不符合API要求
Pendo API的timeSeries中,count参数要求为正整数,你传入的负数-var2是无效值,这是导致400错误的核心原因之一。如果需要从指定日期往前推var2天,可调整参数逻辑:
"timeSeries": { "last": var1, # 将月末日期的时间戳设为时间段结束点 "count": var2, # 往前推对应天数,使用正整数 "period": "dayRange" }
2. 时间戳时区不匹配
time.mktime生成的是本地时区的时间戳,而Pendo API要求UTC时间戳,时区差异会导致时间参数无效。修改时间戳生成逻辑:
from datetime import datetime, timezone for i in dates: dt = datetime.strptime(i, "%Y-%m-%d").replace(tzinfo=timezone.utc) epoch = int(dt.timestamp()) list_epoch.append(epoch)
3. days列表手动维护易出错
手动编写的days列表元素数量冗余(远多于实际需要的9个),且容易出现天数错误,改用Pandas自动生成对应月份的天数:
days = [pd.Period(date_str, freq='M').days_in_month for date_str in dates]
4. JSON解码错误的处理逻辑缺失
当API返回400时,响应内容通常不是JSON格式(比如HTML错误页面),直接调用json.loads会触发解码错误。先判断响应状态码再处理:
response = requests.post(url, json=data_payload, headers=headers) print(response) if response.status_code == 200: response_dictionary = json.loads(response.content) else: # 打印错误详情,方便定位具体问题 print("API错误内容:", response.text)
内容的提问来源于stack exchange,提问作者Caroline Silva
相关产品推荐
相关产品推荐

