Python で HTTP リクエスト - GET, POST, Basic 認証
ここでは Python で HTTP リクエストを送信して、Rest API を使う基本的な方法についてご説明します。
Python の Requests パッケージ
Python で http リクエストの送受信をするには、Requests パッケージが使えます。
pip を使って Requests パッケージをインストールしておいてください。
pip install requests
Python のパッケージのインストールがわからない方は「 Python の pip とは? 」をご覧ください。
HTTP リクエスト - GET メソッド
JSONPlaceholder という開発者用のダミーの REST API を提供してくれているサイトがあります。
そのサイトの以下の API を先ほどインストールした requests モジュールの get() メソッドを使ってデータを取得してみましょう。
この REST API に HTTP リクエストをして、レスポンスのステータスコードとコンテンツの JSON を Python の辞書オブジェクトに変換し、そのキーと値を表示するには次のようにできます。
import requests
url = "https://jsonplaceholder.typicode.com/posts/1"
r = requests.get(url)
print(f"statusCode: {r.status_code}")
resp_dict = r.json()
for key in resp_dict:
print(f"{key}: {resp_dict[key]}")
reponse オブジェクトの json() メソッドで辞書オブジェクトに変換しています。json のデコードに失敗するとエラーになります。
実行結果は次の通りです。レスポンスのコンテンツが辞書オブジェクトに取得できていますね。
statusCode: 200
userId: 1
id: 1
title: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
body: quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto
HTTP リクエスト - POST メソッド & Basic 認証
テスト用に次のような Basic 認証(ベーシック認証)を使用した、item の情報を取得する簡単な REST API を作りました。
API の URL と Basic 認証 のユーザー名とパスワードは次の通りです。
apiURL = "https://softmoco.com/getItemInfo.php"
apiUsername = "APIUser"
apiPassword = "APIPassword123"
リクエストのボディには次のような JSON で itemCode をポストします。
{
"itemCode": "検索したい Item Code"
}
"検索したい Item Code" が "ABC" の時のみ、レスポンスのボディには次のような Item の情報が JSON で返ります。
{{
"success": true,
"message": "ItemCode:ABC found.",
"item": {
"itemCode": "ABC",
"itemName": "ABC Item Name",
"unitPrice": 150
}
}
その他、このテスト用 API の詳細については「 テスト用 REST API の説明 」をご覧ください。
このテスト用 REST API に requests モジュールの post() メソッドを使って、Basic 認証をともなう HTTP リクエストを送信し、データを取得したい時は次のようにできます。
import requests
apiURL = "https://softmoco.com/getItemInfo.php"
apiUsername = "APIUser"
apiPassword = "APIPassword123"
data = {
"itemCode": "ABC"
}
r = requests.post(apiURL, json=data, auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword))
print(f"statusCode: {r.status_code}")
resp_dict = r.json()
for key in resp_dict:
print(f"{key}: {resp_dict[key]}")
メソッドが post() に変わったことと、auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword) で Basic 認証の情報を設定しているところ以外は GET の時とやっていることはほぼ同じです。
実行結果は次の通りです。Item の情報が取得できていますね。
statusCode: 200
success: True
message: ItemCode:ABC found.
item: {'itemCode': 'ABC', 'itemName': 'ABC Item Name', 'unitPrice': 150}
ちなみに、auth=requests.auth.HTTPBasicAuth(apiUsername, apiPassword) を削除して実行すると、次のような結果になります。
statusCode: 401
success: False
message: 401 - Unauthorized
以上、Python で HTTP リクエストを送信して、Rest API を使う基本的な方法についてご説明しました。