Как использовать 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/