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

排查返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:05:17