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

使用Python3 urllib发起无数据PUT请求遇411及TypeError问题求助

解决urllib发送PUT请求的411和TypeError问题

刚好碰到过类似的情况,我来帮你捋清楚怎么解决:

首先拆解下你遇到的两个错误原因:

  • 411错误:你的C#服务要求PUT请求必须携带Content-Length头,而当你用urllib.request.Request发起PUT请求但不传data参数时,urllib不会自动添加这个头,服务器因此返回411(Length Required)错误。
  • TypeError:你尝试传空字符串""作为data,但urllib明确要求请求体必须是bytes类型或者可迭代的bytes对象,字符串类型不被接受,所以抛出了类型错误。

正确的解决方法

只需要把空字符串转换成bytes类型(用b""或者"".encode())作为data参数传入即可。这样做有两个好处:一是符合urllib的参数类型要求,二是urllib会自动帮你设置Content-Length: 0头,刚好满足服务器对请求头的要求。

完整代码示例:

import urllib.request
import urllib.error

# 假设你已经定义好目标地址和请求头
# url = "你的C#服务接口地址"
# headers = {"自定义头键": "值"}

req = urllib.request.Request(url, headers=headers, data=b"", method='PUT')
try:
    response = urllib.request.urlopen(req)
    # 可按需处理响应内容
    response_content = response.read().decode('utf-8')
    print("请求成功,响应内容:", response_content)
except urllib.error.HTTPError as e:
    print(f"HTTP错误: {e.code} - {e.reason}")
except Exception as e:
    print(f"请求失败: {str(e)}")

额外说明

如果你不想传空bytes,也可以手动在headers里添加Content-Length: 0,但此时仍然需要给data参数传一个空的bytes对象(传None的话urllib还是不会自动添加头)。不过直接传b""是最简洁可靠的方式,不用手动管理头信息。

内容的提问来源于stack exchange,提问作者Joshua Simon Bloom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:45:29