Как использовать urllib2.urlopen для запроса POST без аргумента данных

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

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

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

Вы можете приглашать пользователей на событие, отправив HTTP POST /EVENT _ID/приглашен/USER_ID

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

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

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

Ответы

Ответ 1

Похоже, вы хотите отправить пустой запрос 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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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