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

发送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)  # 打印响应内容,便于排查服务器实际返回的信息

修复说明:

  1. 用json参数替代data:requests会自动将字典序列化为JSON字符串,并设置Content-Type: application/json,无需手动处理。
  2. 移除重复序列化:直接传递原始的Boxes数组,避免嵌套JSON字符串问题。
  3. 只保留必要请求头:仅携带Authorization即可,其余冗余头全部删除,requests会自动处理Content-Length等必要请求头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:27:17