如何用Python requests发送无编码的Raw Body POST请求?
解决方案:直接发送原始POST请求体
我完全懂你的需求——你就想原封不动地把abc def ghi=这样的字符串作为POST请求体发出去,既不要自动的百分比编码,也不想被multipart表单的边界和头部包裹,就像Postman里选Raw模式的效果对吧?
其实用Python的urllib.request实现这个很简单,关键是直接传入字节类型的原始payload,而不是字典或文件对象:
import urllib.request # 替换成你的目标CGI服务器URL license_url = "https://your-target-server.com/cgi-endpoint" # 你要发送的原始请求体字符串 raw_payload = "abc def ghi=" # 将字符串转换为字节流(必须,因为Request的data参数要求字节类型) payload_bytes = raw_payload.encode('utf-8') # 构造请求:直接传入字节形式的data,指定POST方法 req = urllib.request.Request(license_url, data=payload_bytes, method='POST') # 如果你的服务器要求特定的Content-Type(比如text/plain),可以添加这个头部 # req.add_header('Content-Type', 'text/plain') # 发送请求并获取响应 response = urllib.request.urlopen(req) print(response.read().decode('utf-8'))
为什么这个方法管用?
- 当你给
data参数传入字节类型的内容时,urllib.request不会对它做任何额外处理,会原封不动地把这个字节流作为HTTP请求的body发送出去,完全符合你要的Raw payload效果。 - 之前用
data={None: data}时,urllib会把字典当成表单数据,自动做application/x-www-form-urlencoded编码,所以才会出现data=abc%3A...的编码结果; - 用
file参数时,它默认会构造multipart/form-data类型的请求,自动生成边界和Content-Disposition头部,这就是你看到那些额外内容的原因。
小提示
如果你的原始请求体包含非UTF-8编码的字符,记得把encode('utf-8')换成对应的编码格式(比如encode('latin-1')),确保字节流和你期望的一致。
内容的提问来源于stack exchange,提问作者James Driver
相关产品推荐
相关产品推荐

