TL;DR
API の仕様上、GET method リクエストを利用するがパラメータはリクエストリングではなく、メッセージ body にパラメータを埋め込みたい場合に urllib を利用してそれを実現する方法。
- urllib は引数として
data
が与えられているとデフォルトで POST method を利用するため、明示的にmethod
を引数で与える必要がある
利用シーン
情報を取得する API endpoint 等は GET リクエストを利用するのが主だと思いますが、リクエストリングに指定するパラメータの情報をアクセスログに出力したくない、等の理由で HTTP のメッセージ body にパラメータを埋め込む必要がある場合を想定しております。
urllib の仕様
urllib のソースコードを確認すると、urllib.request.Request
クラスを利用して HTTP リクエストを生成する際、引数として data
引数にデータを与えると POST method のリクエストが生成されます。
そのため、インスタンス生成時に明示的に method
引数で GET を指定する必要があります。
サンプルコード
例はパラメータを json とする例となります。
- POST method としてインスタンスが生成されるパターン
- 明示的に
method
引数を指定していないため
- 明示的に
sample.py
api_url = "https://hoge/fuga/"
data = {"param" : "test"}
data = json.dumps(data).encode("utf-8")
headers = {"Content-Type" : "application/json"}
request = urllib.request.Request(api_url, data = data, headers = headers)
- GET method としてインスタンスが生成されるパターン
- 明示的に
method
引数を指定しているため
- 明示的に
sample.py
api_url = "https://hoge/fuga/"
method = "GET"
data = {"param" : "test"}
data = json.dumps(data).encode("utf-8")
headers = {"Content-Type" : "application/json"}
request = urllib.request.Request(api_url, method = method, data = data, headers = headers)
おわりに
基本的な内容でしたが、備忘録として残しておきます。