urllib的urlencode返回奇怪的编码结果

2 投票
1 回答
1526 浏览
提问于 2025-04-16 19:27

我正在尝试使用Facebook的REST API,并且我用urllib.urlencode来编码一个JSON字符串或字典。不过,我得到的结果和正确的编码结果不一样(可以通过在这里粘贴字典到附件字段来查看:http://developers.facebook.com/docs/reference/rest/stream.publish/)。我想知道有没有人能提供一些帮助。

谢谢。

编辑:

我正在尝试编码以下字典:

{"media": [{"type":"flash", "swfsrc":"http://shopperspoll.webfactional.com/media/flashFile.swf", "height": '100', "width": '100', "expanded_width":"160", "expanded_height":"120", "imgsrc":"http://shopperspoll.webfactional.com/media/laptop1.jpg"}]}

这是使用urllib.urlencode得到的编码字符串:

"media=%5B%7B%27swfsrc%27%3A+%27http%3A%2F%2Fshopperspoll.webfactional.com%2Fmedia%2FflashFile.swf%27%2C+%27height%27%3A+%27100%27%2C+%27width%27%3A+%27100%27%2C+%27expanded_width%27%3A+%27160%27%2C+%27imgsrc%27%3A+%27http%3A%2F%2Fshopperspoll.webfactional.com%2Fmedia%2Flaptop1.jpg%27%2C+%27expanded_height%27%3A+%27120%27%2C+%27type%27%3A+%27flash%27%7D%5D"

我无法复制Facebook文档链接中给出的结果,但在附件字段中粘贴上述字典时,得到的结果是不同的。

1 个回答

2

urllib.encode 这个函数并不是用来对单个值进行网址编码的(很多语言中同名的函数是这样用的),而是用来对一个包含多个值的字典进行编码。比如说,如果我有一个字典 {"a": 1, "b": 2},它会生成字符串 "a=1&b=2"

首先,你需要把你的字典编码成 JSON 格式。

data = {"media": [{"type":"flash", "swfsrc":"http://shopperspoll.webfactional.com/media/flashFile.swf", "height": '100', "width": '100', "expanded_width":"160", "expanded_height":"120", "imgsrc":"http://shopperspoll.webfactional.com/media/laptop1.jpg"}]}

import json
json_encoded = json.dumps(data)

然后你可以使用 urllib.encode 来创建一个完整的查询字符串。

import urllib
urllib.encode({"access_token": example, "attachment": json_encoded})
# produces a long string in the form "access_token=...&attachment=..."

或者你也可以使用 urllib.quote 仅仅对你的附件参数进行编码。

urllib.quote(json_encoded)
# produces just the part following "&attachment="

撰写回答