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 使うのがいいんでしょうね。