「Web API The Good Parts」をしっかり読んだ

2014 年、結構前の本だったのか。

書籍自体は買っていたけれど、リファレンス的というか、流し読みすらしてなくてかじり読みみたいな感じになっていたので、しっかり読んでみた。
Scrapbox にメモ取りながら読んで行ってたんだけど、メモなのに結構なボリュームになってしまったので公開できない感じに 😩

記憶に残った点

全体的に

この書籍の大事にしている部分でもあるが、正解が無いような部分でも、他の大手の Web サービスの事例を分析し、(その時点の)ベストプラクティスを実践していこうというのがいい感じだなと思った。

Web API だけでなく、たまに原理主義的になってしまうケースを見かけるが、それでは上手く行かない場合や、チームとして付いていけないメンバーを作ってしまうケースもあるので、現実の多くのプロダクトを参考にするというのは現実的だなと思う。

単語をつなげる必要がある場合はハイフンを利用する

SEO的な観点と URI にはアンダースコアは使えないの2つの観点があるという事を知らなかった。なんとなく後者だけの理由で「ハイフン使う」みたいに思っていたけど、他にも観点があるのを知れてよかった。

q=word全文検索のイメージ

あんまり意識したことなかったけど、たしかにそう思っていることがあるなと。

ログインと OAuth 2.0

OAuth を使うことはあっても、割と SDK でぱっと済ませてしまうことがあって、体系的なことが改めて整理されてよかった。

すごく昔に以下の本を読んで分かった気になっていたのを思い出した。
O'Reilly Japan - OAuth 2.0をはじめよう

HATEOAS と REST LEVEL 3 API

何年か前の Ruby Kaigi で Faraday とその拡張を使って HATEOAS の URL をどんどん辿っていけるデモを見た記憶がある。

今だと、これはどういう扱いなんだろ。

データフォーマットの指定方法

クエリパラメータ、拡張子、ヘッダと 3 種類が例に上がっているが、個人的な意外な感じでクエリパラメータが推薦されている。ヘッダ使えとかになるのかと思ったけど、こういう選択をしてくるのはいいな。

配列とフォーマット

JSON インジェクション、なんかハマった記憶が。

性別のデータ

gender の種類の多さ、sex との意図の違いは、全然知らなかったので新鮮。

HTTP ヘッダには RFC 3339 は使えない

知らなかった 😅

エラーの詳細をクライアントに返す

こういうのを知りたくて、リファレンスっぽく使ってたけど、改めて読むと忘れてることが多い。

メンテナンスとステータスコード

Retry-After 使ってなかったな 😩

202 Accepted

処理が完了するまでの時間を Retry-After に入れる事例があるの面白いなぁ。

204 No Content

DELETE が空のレスポンスはいいとして、PUT/PATCH は ETag 用の情報を得る意味でもコンテンツを返すというのはなるほど。

406 Not Acceptable

普通に使ったこと無いし、意識したことない。

500 番台 サーバーに問題があった場合

500と503の違い、ちゃんと意識してなかったなぁ。。

Heuristic Expiration (発見的期限切れ)

クライアントがなんとなく更新頻度とかを判断するというのは考えたことなかった。

Vary でキャッシュの単位を指定する

意識して使ったことが無かったけど、たしかに見たことはあった。

Cache-Control ヘッダ

ほんとに「へーーー」という感じ。

x-で始まるメディアタイプ / 自分でメディアタイプを定義する場合

この歴史的な部分とか、vnd 以外にもあるとか知らなかった。

CORS プリフライトリクエス

聞いたことはあったけど、実際どういうものかよく分かってなかった部分。

CORS とユーザー認証情報

ちゃんと理解できてなかった部分。

API バージョン、どの方法を採用するべきか

URI のパスに含めるのが一般的ということらしい。Github 見てると確かにヘッダに入ってるなと思っていたけど、Google も部分的にしか利用していないらしい。

今はどうなんだろうな。

セキュリティ関係の HTTP ヘッダ

Rails 使ってると以下のような Gem で一気に追加したりするけど、個別に見ていくとよく理解できる。

GitHub - twitter/secure_headers: Manages application of security headers with many safe defaults

レートリミットの単位

Etsy のやり方は面白い。

レートリミットをユーザに伝える

内部向けの API ばかり書いていたので、こういうユーザに伝える方法はあまり意識してなかった。

最後に

もう日本語版の出版から 5 年経っているので、今だと変わっている部分も多いんだろうなぁと。

GraphQL や gRPC といった、REST が担っていた箇所を(部分的 | 全体的) に置き換える技術もこの 5 年で使われてきているので、その辺りとも比べながらキャッチアップしていきたいなと思う。