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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:12:38