在 Python 中的 POST 请求中传递“+”字符

2024-02-25

我正在尝试在 Python 脚本中进行一些自动化操作,但遇到了问题。我正在尝试向服务器发送 POST 消息。

url = 'http://www.example.com'
params = {'arg0': 'value', 'arg1': '+value'}

f = urllib.urlopen(url, urllib.urlencode(params))
print f.read()

我已经完成了等效浏览器操作的wireshark捕获,其中第二个参数,arg1被传递为+value,但是当我用Python来做时+更改为%2B, i.e.

Line-based text data: application/x-www-form-urlencoded
arg0=value&arg1=%2Bvalue

当它应该是:

Line-based text data: application/x-www-form-urlencoded
arg0=value&arg1=+value

我还使用了 Requests 模块,它似乎做了同样的事情。

url = 'http://www.example.com'
params = {'arg0': 'value', 'arg1': '+value'}

f = requests.post(url, params)

当你遇到与“+”相关的问题时,谷歌不是你的朋友,因为它似乎包罗万象。


The +字符是引用 GET 或 POST 数据时空格的正确编码。因此,字面上的+字符也需要转义,以免被解码为另一端的空格。参见 RFC 2396,第2.2节 https://www.rfc-editor.org/rfc/rfc2396#section-2.2, 第3.4节 https://www.rfc-editor.org/rfc/rfc2396#section-3.4HTML 规范,application/x-www-form-urlencoded section http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1:

控件名称和值被转义。空格字符被替换为“+”,然后保留字符被转义,如[RFC1738] http://www.w3.org/TR/html401/references.html#ref-RFC1738,第 2.2 节。

如果您将数据发布到不解码的应用程序+字符转换为空格,而是将此类数据视为文字加号,您需要使用以下方式自己对参数进行编码urllib.quote功能 http://docs.python.org/library/urllib.html#urllib.quote相反,指定+字符不被编码:

import urllib
def urlencode_withoutplus(query):
    if hasattr(query, 'items'):
        query = query.items()
    l = []
    for k, v in query:
        k = urllib.quote(str(k), safe=' /+')
        v = urllib.quote(str(v), safe=' /+')
        l.append(k + '=' + v)
    return '&'.join(l)

Demo:

>>> urlencode_withoutplus({'arg0': 'value', 'arg1': '+value'})
'arg0=value&arg1=+value'

使用时requests,您可以简单地将上述函数的结果作为data值,但在这种情况下您需要手动设置内容类型:

requests.post(url, urlencode_withoutplus(query),
    headers={'Content-Type': 'application/x-www-form-urlencoded'})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中的 POST 请求中传递“+”字符 的相关文章

随机推荐

  • 检查php中是否存在session

    在我的 php 函数中 我想检查会话是否存在 根据会话的存在 我想返回 true 或 false 我有一个登录功能 它使用session start 并在登录时将值存储到会话变量中 并且在注销时将执行此操作session destroy 现
  • list.extend 和列表理解[重复]

    这个问题在这里已经有答案了 当我需要向列表中添加几个相同的项目时 我使用 list extend a a b c a extend d 3 Result a b c d d d 但是 如何与列表理解进行类似的操作呢 a a 2 b 2 c
  • CSS @page 中的不同大小:第一个结果整个@page 大小相同

    它与打印有关 并且仅与打印有关 css page size A4 portrait page first size 210mm 1000mm 根据 CSS 的定义 只有首页高度为 1000 毫米 其余页面高度为 297 毫米 A4 但在 C
  • 为什么在 JavaScript 中返回时要使用括号?

    在Restify框架代码中我发现了这个函数 function queryParser options function parseQueryString req res next Some code goes there return ne
  • 获取逗号分隔字符串的第一个值[重复]

    这个问题在这里已经有答案了 我正在寻找从逗号分隔的字符串中获取第一个值的最快 最短的方法 in line 我能做的就是 string a b c d echo The first thing is end array reverse exp
  • 在 Cypher 查询中使用正则表达式捕获组

    在密码中文档 http docs neo4j org chunked milestone query where html regular expressions它说您可以使用正则表达式来匹配字符串属性中的特定 先前已知 模式 是否也可以使
  • WPF 着色器效果 - 抗锯齿不显示

    我遇到一个问题 我有一个 WPF 着色器效果 由 Rene Schulte 修改 来模拟点阵显示 DMD 一切都很好 但所有的点都是别名的 See attached image 我尝试了WPF中的许多功能 以带来抗锯齿 但无济于事 在构造函
  • 按退出键退出循环

    我试图通过按转义键退出循环 但我的程序不起作用 有没有办法做到这一点 我的代码 import win32api import win32con import time from msvcrt import kbhit getch def c
  • 使用 Java 代码向 main_activity 视图添加按钮

    我想添加一个Button to the main activity使用java代码查看 那么我该怎么做呢 我已经尝试过这段代码 不幸的是它不起作用 public class MainActivity extends Activity But
  • mave 3.2 无法访问本地 Nexus 实例返回 502 代码

    访问本地主机中的本地 Nexus 存储库时 返回代码为 502 pom xml 看起来像这样
  • 在 Windows 10 上为 GitHub 启用多个 SSH 密钥

    我有 2 个 GitHub 帐户 我无法为这两个帐户使用相同的公钥 我已经生成了2个ssh密钥 C Users User Name ssh id rsa C Users User Name ssh id rsa another 我的问题是
  • 如何将await/async 与同步代码结合使用?

    我正在尝试使用await async 来使一些同步代码异步 例如 这可以工作并解除 UI 线程的阻塞 private async void button1 Click object sender EventArgs e var task D
  • 缩小时材质会闪闪发光 ( Three.js r78 )

    缩小时材质会闪闪发光 Three js r78 当缩小到一定程度时 其他物体后面的物体的材质开始显现出来 它看起来与面部重叠 面部位于同一平面 时的效果非常相似 为了证明这一点我做了a fiddle https jsfiddle net w
  • 在 Shiny 和 DataTable 中像字符一样打印但像数字一样排序

    我想对用美元格式化的 DataTable 列 因此是一个字符 进行排序 我用过scales dollar 用于格式化 这会将字段转换为字符 从而导致排序问题 例如 8 gt 10 如何像数字字段一样对字段进行排序 或者 我可以将该字段保留为
  • 需要 SQL 优化(也许 DISTINCT ON 是原因?)

    相关的前一个问题 按值 而不是列 分组后从组中选择随机条目 https stackoverflow com questions 15091363 select a random entry from a group after groupi
  • 我可以在不使用语音命令的情况下从其他应用程序启动 Google Home 上的操作吗?

    我不确定这是否已经可能 我可以让另一个应用程序向 Google Home 发起操作 而不是让人通过与其对话来发起操作吗 例如 我想让 Smartthings IFTTT 要求 Google Home 播放一些内容 下面几个案例 情况 1 如
  • 将 AngularJS 指令绑定到数组的映射

    我有一个接受对象数组的指令 在标记中声明指令时 作用域具有一个对象数组 其中包含指令所需的对象 所以我需要在数组上应用映射函数 执行此操作的正确方法是什么 以便对原始数组进行的更新反映在指令内 这是一个采用幼稚方法的 Plunker 令我惊
  • 添加“System.Data.SQLite”作为参考

    当我构建用 ASP NET 和 C 完成的项目时 它产生了以下错误 命名空间 System Data 中不存在类型或命名空间名称 SQLite 您是否缺少程序集引用 因此 当我尝试将其添加为参考时 我无法在我的库中找到 System Dat
  • jQuery 获取脚本

    我目前一直在使用几个必须以非常特定的顺序加载的 JavaScript 库 由于 jQuery 的 getScript 是异步的 因此它会非常快速地开始下载所有脚本 并在完成后执行它们 由于它们不按顺序执行 我从库中收到多个错误 不幸的是我无
  • 在 Python 中的 POST 请求中传递“+”字符

    我正在尝试在 Python 脚本中进行一些自动化操作 但遇到了问题 我正在尝试向服务器发送 POST 消息 url http www example com params arg0 value arg1 value f urllib url