Python中POST请求返回404,POSTMAN同参数POST请求可正常响应
这种情况我之前碰到过好几次,核心原因几乎都是Python请求的细节和Postman的请求不一致,服务器没匹配到对应的路由,才返回了404错误。咱们一步步拆解可能的问题点:
1. 检查请求头是否完全一致
Postman会自动添加很多默认请求头(比如User-Agent、Accept、Content-Type),而Python的requests库默认的头比较精简,很可能因为缺少某个关键头,导致服务器无法识别请求类型,进而找不到接口。
- 解决方法:打开Postman的请求,点击右上角的「Code」按钮,选择「Python - Requests」,直接复制生成的代码里的
headers部分,替换你自己代码里的头。尤其是要确保Content-Type: application/json存在(如果是JSON请求体的话)。
2. 确认请求体的传递方式
如果你的请求体是JSON格式,Postman会自动把它序列化为正确的格式并设置对应的Content-Type,但Python里如果用data=payload而不是json=payload,请求体会被编码为表单格式,服务器解析不了,自然找不到对应的POST路由。
- 错误示例:
requests.post(url, data=payload, cookies=cookies) # 错误:表单格式,服务器无法识别JSON请求体
- 正确示例:
requests.post(url, json=payload, cookies=cookies) # 正确:自动序列化为JSON并设置Content-Type
3. 验证Cookie的正确性
错误提示里提到「couldn't find a device with id」,说明服务器可能没识别到你的会话,大概率是Cookie传递有问题。Postman里的Cookie可能包含多个键值对,或者某些Cookie的属性(比如Domain)在Python里没正确设置。
- 解决方法:
- 在Postman的「Cookies」面板(请求地址栏旁边的小饼干图标)里,导出所有Cookie为JSON格式;
- 在Python里用
requests.utils.cookiejar_from_dict()把Cookie转成正确的格式,或者直接把Postman里的Cookie字符串复制到headers的Cookie字段中:headers = { "Cookie": "cookie1=value1; cookie2=value2;", # 其他请求头 }
4. 检查URL是否完全匹配
有时候URL末尾的斜杠、特殊字符编码差异,都会导致服务器路由不匹配。比如Postman里的URL是https://example.com/api/device/(带斜杠),而你Python里写的是https://example.com/api/device(不带斜杠),服务器可能把这当成两个不同的路由。
- 解决方法:直接复制Postman地址栏里的完整URL(点击地址栏右侧的复制按钮),粘贴到Python代码里,确保完全一致。
5. 核对设备ID的传递位置
错误信息明确说找不到设备ID,说明你Python的POST请求里,设备ID的传递位置可能和Postman不一样:比如Postman里是放在请求体的JSON字段里,而你放到了URL参数里;或者字段名写错了(比如deviceId vs device_id)。
- 解决方法:在Postman里打开「Body」面板,对比你Python代码里的
payload,确保设备ID的字段名、值、位置完全一致。
快速验证技巧
最直接的方法是用Postman生成Python代码:点击请求右上角的「Code」→ 选择「Python - Requests」,把生成的代码直接运行,应该能得到和Postman一样的结果。如果能正常运行,再逐步对比你自己的代码,找出差异点即可。
内容的提问来源于stack exchange,提问作者ABAJAVa

