发送PUT请求返回200但服务器无响应,Postman正常求排查
问题原因分析与修复方案
核心问题1:Content-Type 配置错误
你的请求代码中设置了Content-Type: application/x-www-form-urlencoded,但实际发送的是JSON格式数据。Postman发送JSON请求时,默认会设置Content-Type: application/json,这是服务器能正确解析请求体的关键。
当你用application/x-www-form-urlencoded时,服务器会尝试把请求体当作表单数据解析,而非JSON,自然无法识别你传递的内容——即使返回200(可能是服务器仅确认请求到达,或解析失败返回默认成功码),也不会执行对应的业务逻辑。
核心问题2:JSON重复序列化
代码中对Boxes做了两次JSON序列化:
Boxes = [{'X': 2423, 'Y': 532, 'W': 7456, 'H': 2345}] res = json.dumps(Boxes) # 第一次序列化,将数组转为JSON字符串 # 第二次序列化,把包含字符串res的字典再转成JSON data=json.dumps({"Boxes": res, "Amount": '234'})
最终服务器收到的Boxes是一个嵌套的JSON字符串(比如"[{\"X\":2423,...}]"),而非预期的数组结构,服务器无法正确解析该字段,导致业务逻辑不执行。
问题3:冗余且错误的请求头
你手动添加了很多服务器响应头(比如Vary、Allow、Content-Length、X-Frame-Options等),这些头是服务器返回给客户端的,客户端请求时完全不需要携带:
Content-Length手动设置为140,但实际请求体长度大概率和这个值不符,服务器会因长度不匹配无法正确解析请求体。- 多余的头可能干扰服务器的正常解析流程。
修复后的代码
import requests Boxes = [{'X': 2423, 'Y': 532, 'W': 7456, 'H': 2345}] # 使用requests的json参数,自动完成序列化与Content-Type设置 r = requests.put( "http://127.0.0.1:8000/snippets/1/", json={"Boxes": Boxes, "Amount": '234'}, headers={'Authorization': 'Token a50ad9e5ff215abd67028a8bd904a11ac0b1409f'} ) print(r.status_code) print(r.text) # 打印响应内容,便于排查服务器实际返回的信息
修复说明:
- 用
json参数替代data:requests会自动将字典序列化为JSON字符串,并设置Content-Type: application/json,无需手动处理。 - 移除重复序列化:直接传递原始的
Boxes数组,避免嵌套JSON字符串问题。 - 只保留必要请求头:仅携带
Authorization即可,其余冗余头全部删除,requests会自动处理Content-Length等必要请求头。
内容的提问来源于stack exchange,提问作者Artemii Khristich
相关产品推荐
相关产品推荐

