Python urlencode 不会编码特殊字符

10
我正在创建一个POST请求。
mydict = {'key1': 'value@1', 'key2': 'value@2'}
encoded_dict = urllib.urlencode(mydict)

这将导致...
key1=value%401&key2=value%402

What I really want is

key1=value@1&key2=value@2

还有其他方法吗?

3
我不明白为什么你想这样做,%40@ 的 URL 编码形式,如果你不想使用编码,那就不要使用 urllib.urlencode() - ajsp
1
我想以key=value的形式发送POST请求。我可以编写代码,但我想知道为什么需要对POST数据进行编码。我发送数据的服务器不接受编码格式的数据。 - Ganesh Satpute
4
urlencode 只是用于编码 URL,而不是编码您的帖子数据。 - John La Rooy
2个回答

4

如果你想做自己的事情,你需要编写自己的编码器。例如:

mydict = {'key1': 'value@1', 'key2': 'value@2'}
>>> "&".join("{}={}".format(*i) for i in mydict.items())
'key2=value@2&key1=value@1'

为什么不直接使用JSON呢?

3
如果OP想要使用这种编码方式对GET查询字符串中的数据进行URL编码,他可以直接使用urllib.quote_plus(mydict, safe='@')。但正如您在评论中所说,这对于POST请求没有任何意义。 - Lukas Graf
不完全是我想要的,但能够达到目的。谢谢John的回答 :) - Ganesh Satpute

0
我正在发布Lukas Graf's的评论到this answer,因为我认为这需要更多的突出。
我遇到了一个问题,我试图对一个字符串进行编码,以匹配一个API调用所期望的。这个API调用需要一个json负载,其中有一个编码的数据值(很复杂 - 不是我的API,所以不能改变!)
无论如何,编码的json值不需要=&编码。为了跳过对这些字符的编码,我使用了这个方法:
import urllib.parse

# more code here

parsed = urllib.parse.quote_plus(unencoded_string, safe='=&')

# more code here, too

为了回答这个问题,你需要修改你的原始代码...
mydict = {'key1': 'value@1', 'key2': 'value@2'}
encoded_dict = urllib.urlencode(mydict)

... 到 ...

mydict = {'key1': 'value@1', 'key2': 'value@2'}
encoded_dict = urllib.parse.quote_plus(mydict, safe='@')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接