urllib的urlencode返回奇怪的编码结果
我正在尝试使用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 个回答
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="