0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

urllibでメッセージbodyにパラメータを埋め込んだGETリクエストを送信する方法

Last updated at Posted at 2019-04-27

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)

おわりに

基本的な内容でしたが、備忘録として残しておきます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?