Как использовать urllib2.urlopen, чтобы сделать POST-запрос без аргумента данных - PullRequest
15 голосов
/ 03 марта 2012

Я пытаюсь использовать urllib2.urlopen для выполнения запросов GET и POST через API Graph Facebook.Отсюда я заметил: https://stackoverflow.com/questions/2690723/facebook-graph-api-and-django, что я могу довольно легко выполнить запрос GET.

И отсюда: Как отправить запрос POST, используя django? и документы Python http://docs.python.org/library/urllib2.html похоже, что для выполнения запроса POST требуется параметр данных.

Но, глядя на API Facebook: http://developers.facebook.com/docs/reference/api/event/#invited там написано

Вымогу пригласить пользователей на событие, введя HTTP-запрос POST для / EVENT_ID / Invite / USER_ID

Я не уверен, как я могу это сделать с помощью urlopen, поскольку непосредственное открытие этого URL будет проверять толькопользователь был приглашен, как указано на странице API:

Вы можете проверить, был ли конкретный пользователь приглашен на событие, введя HTTP GET для / EVENT_ID / Invite / USER_ID:

Оцените вход.

Ответы [ 4 ]

36 голосов
/ 03 марта 2012

Звучит так, как будто вы хотите отправить пустой запрос POST, хотя urllib2.urlopen () отправляет сообщение только при указании параметра данных.

Кажется, что он на самом деле отправляет пустой POST, если вы установили data = "", и GET-запрос, только когда data = None:

urllib2.urlopen("http://127.0.0.1:8000", data="")
"POST / HTTP/1.1" 501 - 

urllib2.urlopen("http://127.0.0.1:8000", data=None)
"GET / HTTP/1.1" 200 -

Надеюсь, это поможет. Я получил распечатки ответов с маленького HTTP-сервера, для которого у них есть пример: http://docs.python.org/library/simplehttpserver.html

2 голосов
/ 03 июля 2013

Напрямую из Python (urllib2) Документация

urllib2.urlopen (url [, данные] [, тайм-аут]) Откройте URL-адрес URL, который может быть либо строкой, либо объектом запроса. Предупреждение HTTPS-запросы не выполняют никакой проверки сертификата сервера. data может быть строкой, указывающей дополнительные данные для отправки на сервер, или None , если такие данные не нужны. В настоящее время только HTTP-запросы используют данные; HTTP-запрос будет POST вместо GET, если указан параметр data.

2 голосов
/ 30 августа 2012

Другой способ отправить пустой POST - создать запрос и переопределить его get_method. Это больше работы в этом случае, но может быть чище в других случаях (например, если у вас уже есть запрос).

    request = urllib2.Request(url)
    request.get_method = lambda: 'POST'
    urllib2.urlopen(request)

get_method - это метод, который возвращает используемый метод, поэтому здесь мы перезаписываем его лямбда-функцией, которая возвращает 'POST'.

0 голосов
/ 03 марта 2012

Я думаю, что вы в значительной степени ответили на свой вопрос, вы просто обдумываете его ...

  • Чтобы пригласить пользователя выпустить POST с urlopen

  • Чтобы проверить, был ли пользователь приглашен, введите GET с urlopen.

В обоих случаях вы общаетесь с одним и тем же URL, разницаэто GET или POST.

Если вы не уверены в разнице между GET и POST с urlopen, прочитайте этот документ:

http://www.doughellmann.com/PyMOTW/urllib2/

...