実用的なアプリケーションとベストプラクティス
さまざまな種類のカスタムヘッダーを設定する方法を学んだので、実際のシナリオでヘッダーを操作するための実用的なアプリケーションとベストプラクティスを見てみましょう。
JSON データの送受信
最新の API を操作する場合、JSON が最も一般的なデータ形式です。JSON リクエストのヘッダーを適切に設定する方法を見てみましょう。
json_requests.py という名前の新しいファイルを作成します。
- 次のコードを追加します。
import requests
import json
url = 'https://httpbin.org/post' ## このエンドポイントは POST リクエストを受け入れます
## 送信するデータ
data = {
'name': 'John Doe',
'email': 'john@example.com',
'message': 'Hello, world!'
}
## JSON に適切なヘッダーを設定する
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
## 方法 1: json パラメータを使用する (推奨)
print("Method 1: Using the json parameter")
response = requests.post(url, json=data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## 受信したヘッダーを表示する
print(f"\nData sent (as received by server): {response.json()['json']}")
## 方法 2: 手動で JSON に変換する
print("\nMethod 2: Manually converting to JSON")
json_data = json.dumps(data)
response = requests.post(url, data=json_data, headers=headers)
print(f"Status Code: {response.status_code}")
print(response.json()['headers']) ## 受信したヘッダーを表示する
print(f"\nData sent (as received by server): {response.json()['json']}")
- スクリプトを実行します。
python json_requests.py
次のような出力が表示されるはずです。
Method 1: Using the json parameter
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab12-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
Method 2: Manually converting to JSON
Status Code: 200
{'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '72', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'X-Amzn-Trace-Id': 'Root=1-6430ab13-abc123def456'}
Data sent (as received by server): {'name': 'John Doe', 'email': 'john@example.com', 'message': 'Hello, world!'}
どちらの方法も機能しますが、方法 1 の方が便利です。Requests ライブラリが JSON 変換を処理してくれるからです。
デフォルトヘッダーを持つ再利用可能なセッションの作成
同じヘッダーで複数のリクエストを行う必要がある場合は、Session オブジェクトを使用すると、時間を節約し、コードをよりクリーンにすることができます。
session_headers.py という名前の新しいファイルを作成します。
- 次のコードを追加します。
import requests
## セッションオブジェクトを作成する
session = requests.Session()
## このセッションで行われるすべてのリクエストのデフォルトヘッダーを設定する
session.headers.update({
'User-Agent': 'MyCustomApp/1.0',
'Accept-Language': 'en-US,en;q=0.9',
'X-API-Key': 'my_session_api_key'
})
## セッションを使用してリクエストを行う - デフォルトヘッダーが含まれます
print("First request with session:")
response = session.get('https://httpbin.org/headers')
print(response.json())
## このリクエスト専用のカスタムヘッダーを追加する
print("\nSecond request with additional header:")
response = session.get('https://httpbin.org/headers',
headers={'X-Custom-Header': 'Just for this request'})
print(response.json())
## 元のヘッダーは、今後のリクエストでは変更されません
print("\nThird request (original headers only):")
response = session.get('https://httpbin.org/headers')
print(response.json())
- スクリプトを実行します。
python session_headers.py
次のような出力が表示されるはずです。
First request with session:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab45-abc123def456'}}
Second request with additional header:
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Custom-Header': 'Just for this request', 'X-Amzn-Trace-Id': 'Root=1-6430ab46-abc123def456'}}
Third request (original headers only):
{'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9', 'Host': 'httpbin.org', 'User-Agent': 'MyCustomApp/1.0', 'X-API-Key': 'my_session_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab47-abc123def456'}}
セッションを使用することは、いくつかの理由からベストプラクティスです。
- パフォーマンスの向上 (接続プーリング)
- リクエスト全体での一貫したヘッダー
- 自動 Cookie 処理
- 必要に応じてリクエストごとのカスタマイズを追加する機能
ヘッダーを操作するためのベストプラクティス
まとめとして、HTTP ヘッダーを操作する際に従うべきベストプラクティスをいくつか紹介します。
- 同じドメインへの複数のリクエストには、Session オブジェクト を使用します。
- 送信するデータに対して、Content-Type ヘッダー を正しく設定します。
- 認証を適切に処理する - 可能であれば、組み込みの認証を使用します。
- 機密情報を安全に保つ - API キーやトークンをハードコードしないでください。
- 必要なヘッダーについては、API ドキュメントを注意深く確認してください。
これらのベストプラクティスを示す最終的な例を次に示します。
best_practices.py という名前の新しいファイルを作成します。
- 次のコードを追加します。
import requests
import os
## 実際のアプリケーションでは、これらを環境変数または安全な設定から取得します
## この例では、シンプルに保っています
API_KEY = os.environ.get('API_KEY', 'default_api_key')
BASE_URL = 'https://httpbin.org'
def create_api_client():
"""デフォルトヘッダーを持つ再利用可能なセッションを作成します。"""
session = requests.Session()
## 共通ヘッダーを設定する
session.headers.update({
'User-Agent': 'MyApp/1.0',
'X-API-Key': API_KEY,
'Accept': 'application/json'
})
return session
def get_data(client, endpoint):
"""指定されたエンドポイントに GET リクエストを行います。"""
url = f"{BASE_URL}/{endpoint}"
response = client.get(url)
return response.json()
def post_data(client, endpoint, data):
"""JSON データを使用して POST リクエストを行います。"""
url = f"{BASE_URL}/{endpoint}"
response = client.post(url, json=data)
return response.json()
## 使用例
def main():
## API クライアントを作成する
client = create_api_client()
## GET リクエストの例
print("Making GET request...")
get_response = get_data(client, 'headers')
print(f"Headers sent: {get_response['headers']}")
## POST リクエストの例
print("\nMaking POST request...")
data = {'name': 'John', 'age': 30}
post_response = post_data(client, 'post', data)
print(f"Data received by server: {post_response['json']}")
if __name__ == '__main__':
main()
- スクリプトを実行します。
python best_practices.py
次のような出力が表示されるはずです。
Making GET request...
Headers sent: {'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'MyApp/1.0', 'X-API-Key': 'default_api_key', 'X-Amzn-Trace-Id': 'Root=1-6430ab78-abc123def456'}
Making POST request...
Data received by server: {'name': 'John', 'age': 30}
この例は、再利用可能なセッションの作成、コードを関数への整理、ハードコードされた機密情報の回避など、ベストプラクティスに従い、カスタムヘッダーを使用して HTTP リクエストを行うための構造化されたアプローチを示しています。