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

时间:2011-06-13 10:27:25

标签: python json facebook facebook-graph-api 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 rest文档链接中抛出的结果,但是在附件字段中复制上面的字典时,结果是不同的。

1 个答案:

答案 0 :(得分:2)

urllib.encode不是用于对单个值进行urlencoding(因为同名函数在多种语言中),而是用于编码单独值的dict。例如,如果我有dict {"a": 1, "b": 2},它将产生字符串"a=1&b=2"

首先,您希望将dict编码为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="