ウェブページにアクセスしてステータス、データを手に入れるための定義をRESTと呼んだりします。クライアントが行いたい処理をサーバーに伝えるHTTPメソッドとして次のようなものがあります。
- HEAD データそのものではなくデータの情報を取得
- GET データの取得
- POST データの新規追加
- PUT データの更新
- DELETE データの削除
ここではPythonの標準ウェブライブラリであるurllibを使って、これらのHTTPメソッド操作してみます。
HTTP通信のテストをするのにテスト用サーバーを用意するのはここでは手間がかかるので、 https://httpbin.org/ というテストサービスのサイトをここでは利用します。
最初にurllibのモジュールをインポートしておきましょう。
import urllib.request
では、urllib.requestの使い方を見ていきましょう。
HTTPヘッダー情報を取得
まずはHTTPヘッダー情報を取得するコードを書いてみます。
import urllib.request
url = 'https://httpbin.org/'
conn = urllib.request.urlopen(url)
print(conn.status)
print('-' * 30)
for key, value in conn.getheaders():
print(key, value)
urlを指定し、urlopen()で開いています。これをstatusを使ってHTTPステータスコードを取得します。通信が上手くいってるはずならここで200が出力されるはずです。
見やすいように’-‘を使って区切り線を入れています。
ヘッダー情報はgetheaders()で得られます。この情報をキーと値に分けて全ての情報を出力しています。
これを実行するとこうなります。(ファイル名をhttpbin.pyにしてAtomで実行しています)
サーバーが無事応答しているので200が出力されています。ヘッダー情報もご覧の通りです。
GET
次はGETをやってみましょう。https://httpbin.orgのトップページを見ると、返してくれるリクエスト形式の一覧が見られるのでそれに合わせてやってみましょう。
import urllib.request
url = 'https://httpbin.org/get'
conn = urllib.request.urlopen(url)
print(conn.read().decode('utf-8'))
先ほどとの違いはurlにgetを繋げている点です。アクセスして得られたデータをread()で読み込んでいますが、このままだとバイトの形で出力されるのでdecode()を使ってutf-8に変換したものを出力しています。
これを実行するとこうなります。
JSON形式で値が返っています。
このGETにパラメーターを渡した場合をやってみましょう。
data = {‘k1’: ‘v1’, ‘k2’: ‘v2’} と言う辞書型のパラメーターを使ってコードを書いてみます。
import urllib.request
data = {'k1': 'v1', 'k2': 'v2'}
url = 'https://httpbin.org/get' + '?' + urllib.parse.urlencode(data)
conn = urllib.request.urlopen(url)
print(conn.read().decode('utf-8'))
getの時にパラメーターを使うには、URLに’?’を繋げてパラメーターを渡します。ここでは辞書型のパラーメーターを渡すのですが、parse.urlencode()で構文を解析してエンコードしたものを繋げています。これを上と同様に出力します。
パラメーターが反映された形で出力されています。
POST
次はPOSTをやってみましょう。
POSTはデータを新規登録する通信ですが、GETのような形でパラメーターをURLに繋げていた場合は、そのURLが他の人に見られてしまうと問題が起こる場合があります。例えばパスワードなどです。
ですので、POSTではURLそのものを渡すのではなくPOSTデータの入ったオブジェクトを渡す形になります。
同様のパラメーターを使ってPOSTのコードを書いて見ます。
import urllib.request
import json
data = {'k1': 'v1', 'k2': 'v2'}
params = json.dumps(data).encode('utf-8')
req = urllib.request.Request('https://httpbin.org/post', data=params, method='POST')
conn = urllib.request.urlopen(req)
print(json.loads(conn.read().decode('utf-8')))
ここではjsonモジュールもインポートします。json.dumps()でパラーメータのデータを文字列として整形し、utf-8でエンコードします。これをrequest.Request()にpostのURLと共にパラメーターとして渡し、methodを’POST’にします。これをurlopen()で開き、読み込んだものをutf-8にデコードしてJSON形式で出力します。
実行するとこうなります。
パラメーターがpostで送られているのがわかります。
PUT
次はPUTをやってみましょう。これはもうほぼ同じで、先ほどのpostをputに変えるだけです。
import urllib.request
import json
data = {'k1': 'v1', 'k2': 'v2'}
params = json.dumps(data).encode('utf-8')
req = urllib.request.Request('https://httpbin.org/put', data=params, method='PUT')
with urllib.request.urlopen(req) as f:
print(json.loads(f.read().decode('utf-8')))
URLの部分をputにし、methodをPUTにしています。今までと同じように開いてもいいのですが、ここではwithステートメントを使ってみました。
実行するとこうなります。
putで処理した情報が得られました。
DELETE
最後にDELETEをやってみましょう。これも上のコードの該当部分をdeleteに変えるだけです。
import urllib.request
import json
data = {'k1': 'v1', 'k2': 'v2'}
params = json.dumps(data).encode('utf-8')
req = urllib.request.Request('https://httpbin.org/delete', data=params, method='DELETE')
with urllib.request.urlopen(req) as f:
print(json.loads(f.read().decode('utf-8')))
URLの部分をdeleteにし、methodをDELETEにしています。他は同じです。
実行します。
deleteの情報が得られました。
まとめ
ここではPythonのurllib.requestを使って、HTTP通信のテストをやってみました。
クライアントが行いたい処理をサーバーに伝えるHTTPメソッドには、GET、POST、PUT、DELETEがあります。
GETはデータの取得、POSTはデータの新規追加、PUTはデータの更新、DELETEはデータの削除です。やり方は上でやったような扱い方を知っておきましょう。
HTTP通信のテストにはサーバーを自分で用意しなくても、https://httpbin.orgなどのテストサービスサイトがあります。