やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

requestsライブラリについて調べてみる

requestsPythonの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/json
  • application/vnd.github.VERSION.raw

バイナリデータはすべてapplication/vnd.github.VERSION.rawで表現する。BASE64形式に変換して送受信する。

ソースは以下。

これで全部かどうかは知らない。ちゃんとContent-Typeを付与してくれるかどうかも知らない。

所感

この辺の処理を実装してみるか。その前にMimeTypeデータベースが必要か。GitHubAPIだけなら不要か。