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,完全丢失了服务端返回的具体校验提示(比如非法字段、格式不匹配、只读字段被提交等具体错误原因),导致排查无明确方向。
- 现有代码在非200状态码分支直接返回
修正方案
- 调整传参方式:将字典参数通过
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 NonePython 3.7环境下2.20及以上版本的
requests库完全兼容上述写法,不存在版本适配问题。
内容的提问来源于stack exchange,提问作者Blank
相关产品推荐
相关产品推荐

