我正在为我正在尝试制作脚本的游戏写POST请求。对于这篇文章,我使用的是公共req = urllib.request.Request(url=url, data=params, headers=headers)
首先,我有一个请求所需数据的字典,我必须用params = urllib.parse.urlencode(OrderedDict[])
然而,这给了我一个字符串,但不是正确的!它会给我:
&x=_1&y_=2&_z_=3
但是,游戏编码的方式应该是:
&x=%5F1&y%5F=2&%5Fz%5F=3
因此我的下划线不会编码为“%5F”。我该如何解决?如果可以,我有游戏使用的参数(在网址中,预编码),我能否在请求的数据字段中使用它?
答案 0 :(得分:2)
下划线不需要编码,因为它们是网址中的有效字符。
根据RFC 1738:
不安全:
由于多种原因,角色可能不安全。空间 角色是不安全的,因为重要的空间可能会消失 当转录URL时,可能会引入无关紧要的空格 排版或受到文字处理程序的处理。 字符
<
和>
不安全,因为它们被用作 自由文本中的URL分隔符;引号("
)用于 在某些系统中划分URL。角色#
不安全且应该 总是被编码,因为它在万维网和其他网络中使用 用于从可能的片段/锚标识符界定URL的系统 跟着它。字符%
不安全,因为它用于 其他角色的编码。其他角色不安全因为 已知网关和其他传输代理有时会修改 这样的人物。这些字符为{
,}
,|
,\
,^
,~
,[
,]
和`
。所有不安全的字符必须始终在URL中编码。
因此_
未被%5F
取代的原因与a
未被%61
取代的原因相同:它不是必需的。网络服务器不管(或不应该)关心。
如果您尝试使用的网络服务器确实关心(但请先检查是否属于这种情况),您必须做一些手动工作,因为urllib引用{{ 3}} _
:
urllib.parse.quote(字符串,安全=&#39; /&#39;,编码=无,错误=无)
使用
%xx
转义替换字符串中的特殊字符。从不引用字母,数字和字符_.-
。
您可以使用自己的函数包装quote()
并将其传递给urlencode()
。这样的事情(完全未经测试):
def extra_quote(*args, **kwargs):
quoted = urllib.pars.quote(*args, **kwargs)
return str.replace(quoted, '_', '%5F')
urllib.parse.urlencode(query, quote_via=extraquote)