requestsライブラリについて調べてみる
requestsはPythonのHTTPクライアント用ライブラリ。
前回まで
http://ytyaru.hatenablog.com/entry/2017/10/15/000000
http://ytyaru.hatenablog.com/entry/2017/10/16/000000
http://ytyaru.hatenablog.com/entry/2017/10/17/000000
HTTP応答のエラー
http://requests-docs-ja.readthedocs.io/en/latest/user/quickstart/#id8
r.raise_for_status()
リポジトリ削除APIは正常コードが200
でなく204
だが正常とみなされるだろうか?
正常系コード以外は共通化できる?いちいち正常ステータスコードをDBに保存することは不要?例外発生コードも不要?
HTTP応答のJSON
r.json()
でJSONデータをpythonのdict型にパースする。
エラー処理
JSONデコードに失敗した時の処理がバージョンによって異なるようだ。
英語の新しいドキュメントには以下の例外が発生するとある。
ValueError: No JSON object could be decoded
日本語の古いドキュメントにはNone
が返るとある。
型の取得
事前に型がわかればいい。前回のように以下のようなHttpHeaderから型を取得し、処理を実装すればいい。
Content-Type: application/json; charset=utf-8
X-GitHub-Media-Type: github.v3; format=json
おそらくr.headers['Content-Type']
で取得できるだろう。
MimeTypeデータベースは必要だろうか。大げさな気がするが、画像データのときの応答も自動化できるなど応用範囲が広がる。
requestsのサイトによると、r.text
, r.json()
以外にも以下のようにできるらしい。
バイナリデータ(画像)。
from PIL import Image from io import BytesIO i = Image.open(BytesIO(r.content))
ストリーミング。
>>> r = requests.get('https://api.github.com/events', stream=True) >>> r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810> >>> r.raw.read(10)
はたしてGitHubAPIで使うかどうか。
GitHubでのMimeType
バイナリデータはすべてapplication/vnd.github.VERSION.raw
で表現する。BASE64形式に変換して送受信する。
ソースは以下。
これで全部かどうかは知らない。ちゃんとContent-Type
を付与してくれるかどうかも知らない。
所感
この辺の処理を実装してみるか。その前にMimeTypeデータベースが必要か。GitHubAPIだけなら不要か。