urlencode urllib, возвращающий странные закодированные результаты - PullRequest
2 голосов
/ 13 июня 2011

Я пытаюсь использовать API REST Facebook и кодирую строку / словарь JSON, используя urllib.urlencode. Однако полученный мной результат отличается от правильного закодированного результата (как показано при вставке словаря в поле здесь: http://developers.facebook.com/docs/reference/rest/stream.publish/). Мне было интересно, может ли кто-нибудь предложить какую-либо помощь.

Спасибо.

EDIT:

Я пытаюсь закодировать следующий словарь:

{"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 голосов
/ 13 июня 2011

urllib.encode не предназначен для urlen-кодирования одного значения (так как функции с одинаковыми именами во многих языках), но предназначен для кодирования набора отдельных значений.Например, если бы у меня был 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="
...