使用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
相关产品推荐
相关产品推荐

