我试图对此参数进行urlencode:
params = {
"attachments": [
{
"title": "output.title",
"text": "output.text",
}
]}
urllib.urlencode(params, True)
这就是我得到的:
attachments=%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D
这就是我所期待的:
attachments=%5B%7B%22text%22%3A%20%22output.text%22%2C%20%22title%22%3A%22output.title%22%7D%5D
更新:
我注意到,如果我禁用dosec,我会得到更接近我需要的东西。
urllib.urlencode(params)
attachments=%5B%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D%5D
但仍有差异%22%vs%27%
答案 0 :(得分:1)
好%22
是双引号("
),而%27
是简单引用('
)。并且urllib.urlencode
只是编码字典或两元素元组的序列。
所以这里你的词典以attachement
为关键词,并且下面的词典列表为值:
val = [
{
"title": "output.title",
"text": "output.text",
}
]
但对于python,该列表不是一个字符串,因此它将其表示形式用作字符串(使用简单的引号):
>>> str(val)
[{'text': 'output.text', 'title': 'output.title'}]
然后urlencode该字符串。如果你想要双引号兼容Json,你应该使用json模块:
>>> json.dumps(val)
'[{"text": "output.text", "title": "output.title"}]'
最后它会给出:
>>> urllib.urlencode({ k: json.dumps(v) for k,v in params.iteritems() })
'attachments=%5B%7B%22text%22%3A+%22output.text%22%2C+%22title%22%3A+%22output.title%22%7D%5D'
这是你所期望的(除了项目的顺序,但字典是一个哈希,不维护顺序 - 如果你需要订单,使用一系列对)
答案 1 :(得分:0)
Python字典类型,如下所示,
>>> params = {
... "attachments": [
... {
... "title": "output.title",
... "text": "output.text",
... }
... ]}
>>> print params
{'attachments': [{'text': 'output.text', 'title': 'output.title'}]}
urllib.urlencode转义那些字符串。所以你得到“%27”这是单引号的html转义字符。
但你想逃到“%22”(双引号)。
如果您需要,那么您不必直接使用urlencode。
尝试使用json转储并对每个项目进行编码。
像,
import urllib
import json
def myencode(dic):
return urllib.urlencode({d: json.dumps(dic[d]) for d in dic})
params = {
"attachments": [
{
"title": "output.title",
"text": "output.text",
}
]}
urllib.urlencode(params, True)
myencode(params)