読者です 読者をやめる 読者になる 読者になる

AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

urllib2.urlopen() で GET/POST を使い分け

Python の urllib2 で、ちょっとした仕様に気づいてなかったのでメモ。

urlopen() の 第2引数 data を渡すと、必ずPOSTの挙動になるようです。

確認環境:

POST Data

なにげに data を渡すと、POST methodが送られる Requestオブジェクトが作られます。HOWTOからコードを抜粋。

import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)

このように確認できます。

In [9]: req.get_method()
Out[9]: 'POST'

参考:

GET with Data

でも、多くのサイトで GET パラメーターでデーターを送りたいこともあります(よね?)。dataを渡さなければいいんですが、個人的には、この書き方が綺麗だなぁと思いました。

...前半は POST Data と同じ...

data = urllib.urlencode(values)
req = urllib2.Request(url + ('?%s' % data))
response = urllib2.urlopen(req)

確認すると、ちゃんとGETになっています。

In [9]: req.get_full_url()
Out[9]: 'http://www.someserver.com/cgi-bin/register.cgi?name=Michael+Foord&language=Python&location=Northampton'

In [10]: req.get_method()
Out[10]: 'GET'

参考:

その他

そもそも urllib と urllib2 の2つが何故あるのだろうか?という点、まだ勉強していない。時間をみつけて、こちらのエントリーなどをチェック予定です。

前述のエントリー最後にもあるように、Python3系では urllibは廃止され、urllib2 の流れで続くみたいなので基本的には urllib2 使うのがいいんでしょうね。