web-dev-qa-db-ja.com

urllib2.urlopenを使用してデータ引数なしでPOSTリクエストを作成する方法

Urllib2.urlopenを使用してGETとPOSTリクエストを実行しようとしています。ここから気づきました: https://stackoverflow.com/questions/2690723/ facebook-graph-api-and-Django GETリクエストをかなり簡単に実行できます。

そしてここから: djangoを使用してPOSTリクエストを送信する方法は? およびPythonドキュメント http:// docs.python.org/library/urllib2.html POSTリクエストを実行するには、データパラメータが必要なようです。

しかし、FacebookのAPIを見ると: http://developers.facebook.com/docs/reference/api/event/#invited

HTTP POST to/EVENT_ID/invited/USER_IDを発行することにより、ユーザーをイベントに招待できます

APIページに記載されているように、このURLを直接開くと、ユーザーが招待されているかどうかのみが確認されるため、urlopenを使用してこれを行う方法がわかりません。

/ EVENT_ID/invited/USER_IDにHTTPGETを発行することにより、特定のユーザーがイベントに招待されているかどうかを確認できます。

入力に感謝します。

15
airfang

Urllib2.urlopen()はデータパラメータを指定した場合にのみ投稿を送信しますが、空のPOSTリクエストを送信したいようです。

実際には空のPOST、data = Noneの場合にのみGETリクエストを送信するようです:

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

36
Christian

空のPOSTを送信する別の方法は、リクエストを作成してそのget_methodをオーバーライドすることです。これはこの場合はより手間がかかりますが、他の場合はよりクリーンになる可能性があります(すでにリクエストがある場合は、例)。

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

get_methodは、使用するメソッドを返すメソッドであるため、ここでは、「POST」を返すラムダ関数でオーバーライドします。

2
scjody

Python (urllib2) ドキュメントから直接

urllib2.urlopen(url [、data] [、timeout])URL urlを開きます。これは、文字列またはRequestオブジェクトのいずれかです。警告HTTPSリクエストは、サーバーの証明書の検証を行いません。 dataは、サーバーに送信する追加データを指定する文字列、またはそのようなデータが必要ない場合はNoneの場合があります。現在、データを使用するのはHTTPリクエストだけです。 HTTPリクエストは、データパラメータが指定されている場合、GETではなくPOST)になります。

2
Shashank

私はあなたがあなた自身の質問にほとんど答えたと思います、あなたはそれをただ考えすぎています...

  • ユーザーを招待するには、urlopenでPOST

  • ユーザーが招待されているかどうかを確認するには、urlopenを使用してGETを発行します。

どちらの場合も、同じURLで通信していますが、違いはGETまたはPOSTです。

GETとa POST with urlopen)の違いがわからない場合は、次のドキュメントをお読みください。

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

0
Gil Birman