You need to enable JavaScript to run this app. Python 3.7下如何正确使用requests.put调用Datadog API解决400报错
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.7下如何正确使用requests.put调用Datadog API解决400报错

Datadog监控编辑接口返回400的根因定位

核心错误点

  • requests.put()传参逻辑不符合库的设计规则
    • requests的PUT方法第二个位置参数对应data入参,直接传入Python字典时,库会自动将参数编码为application/x-www-form-urlencoded格式的表单数据。即便请求头中强制声明Content-Type: application/json,实际传输的请求体格式与头声明的格式不匹配,Datadog服务端解析失败会直接返回400。
  • 错误处理逻辑直接丢弃了服务端返回的报错详情
    • 现有代码在非200状态码分支直接返回None,完全丢失了服务端返回的具体校验提示(比如非法字段、格式不匹配、只读字段被提交等具体错误原因),导致排查无明确方向。

修正方案

  • 调整传参方式:将字典参数通过json关键字参数传入,requests会自动将Python字典序列化为合规的JSON字符串,同时自动匹配对应请求头,无需手动在headers中重复声明Content-Type。
  • 调试阶段打印完整响应内容,不要直接吞掉错误返回。
  • 提交前从请求体中过滤掉接口不允许修改的只读字段(比如monitor id、创建时间、创建人标识等),避免字段校验触发400。

修正后的函数参考实现:

def editMonitor(monitor_Data):
    # 提取监控ID拼接请求URL,同时将ID从请求体中移除(属于只读字段,不允许随请求体提交)
    monitor_id = str(monitor_Data.pop('id'))
    api_url = f'https://api.datadoghq.com/api/v1/monitor/{monitor_id}'

    # 通过json关键字传参,确保请求体为合法JSON格式
    response = requests.put(
        api_url,
        json=monitor_Data,
        headers=headers
    )

    # 打印完整状态码和响应文本,保留服务端返回的错误详情
    print(f"状态码:{response.status_code}, 响应内容:{response.text}")

    if response.status_code == 200:
        return response.json()
    return None

Python 3.7环境下2.20及以上版本的requests库完全兼容上述写法,不存在版本适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 10:24:05