urlencode urllib возвращает странные закодированные результаты

Я пытаюсь использовать REST API Facebook и кодирую строку/словарь JSON, используя urllib.urlencode. Однако результат, который я получаю, отличается от правильного закодированного результата (как показано, вставив словарь в поле вложения здесь 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, но при копировании вышеуказанного словаря в поле вложения результат отличается.


person iman453    schedule 13.06.2011    source источник
comment
Просто примечание об устаревании: мы находимся в процессе прекращения поддержки REST API, поэтому, если вы создаете новое приложение, вам не следует использовать эту функцию. Вместо этого используйте Graph API и отправляйте объект Post в канал связи объекта User.   -  person miku    schedule 13.06.2011
comment
Не могли бы вы привести пример ввода/вывода, который ведет себя неожиданно?   -  person Jeremy    schedule 13.06.2011
comment
@miku: Результат, возвращаемый ссылкой, которую я разместил, работает, хотя (я использую REST поверх графика, поскольку график не позволяет указывать высоту при публикации флэш-файлов). Единственная проблема, с которой я сталкиваюсь, это то, что я не могу правильно кодировать свои вложения. Спасибо за ваш комментарий :)   -  person iman453    schedule 13.06.2011
comment
@jeremy: конечно, я отредактирую свой вопрос   -  person iman453    schedule 13.06.2011


Ответы (1)


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