仕組みから学ぶ Web
応用読了目安 15#API#バージョニング#後方互換#破壊的変更#非推奨

API のバージョニング — 変えられないものを、どう変えるか

レスポンスから使っていないフィールドを1つ消した。翌日、古いアプリが全部落ちた。自分が使っていないことと、誰も使っていないことは違う。

この記事の進み方

What — 何が「壊す変更」なのか

API の変更には、壊すものと壊さないものがあります。この線引きを知らないと、どちらか分からないまま出すことになります。

Compare壊す変更と、壊さない変更

古い利用者が、コードを変えずに動き続ける変更。

レスポンスに項目を足す
{ id, name, price }
→ { id, name, price, sku }

任意のパラメータを足す
GET /products
→ GET /products?sort=price

新しいエンドポイントを足す
古い利用者
動き続ける
予告
不要
バージョン
上げなくてよい
  • ただし「未知の項目を無視する」実装であることが前提。厳格に検証する利用者は落ちる。
  • その前提を、API の文書に明記しておく。

判断の基準は「古い利用者のコードが、そのまま動き続けるか」。自分にとって自然な整理が、相手にとっては破壊になる。

後方互換
古い利用者が、変更後もそのまま動き続けること。
破壊的変更
後方互換を失う変更。利用者側の修正が必要になる。
非推奨
まだ動くが、将来消す予定であることを示す状態。
サンセット
提供を終了すること。日付を予告してから行う。
寛容な読み取り
知らない項目を無視し、必要な項目だけを読む実装方針。

「誰も使っていない」は、確認できないことが多い

冒頭の事故の核心はここです。

自分が見える範囲(自社の Web、管理画面)は調べられます。しかし次は調べられません。

  • 過去に配布したモバイルアプリ
  • 利用者が書いた連携スクリプト
  • 取引先が作ったシステム
  • 誰かのブラウザに残っているタブ

「使われていないことを証明する」のは、ほぼ不可能です。できるのは「使われている証拠を探す」ことだけです。

Why — API は、出した瞬間に自分のものではなくなる

相手のリリース速度は、こちらより遅い

Web なら、リロードすれば新しいコードが動きます。モバイルアプリは違います。

  • 審査に数日
  • 利用者が更新するまで数週間〜数か月
  • 更新しない利用者が一定数、永久に残る

取引先のシステムはさらに遅い。改修の予算と工数を確保するところから始まります。

こちらが1日で出せる変更を、相手が取り込むのに半年かかる。 この非対称さが、API の変更を難しくしています。

利用状況は、測っていなければ分からない

「その項目を誰が読んでいるか」は、レスポンスを返す側からは見えません

分かるのは「そのエンドポイントを誰が叩いたか」までです。返した JSON のどの項目を使ったかは、相手の中の話です。

だから、項目単位の削除は特に危険です。エンドポイントの利用は測れても、項目の利用は測れません。

Figure測れるものと測れないもの
  1. 1エンドポイント
  2. 2パラメータ
  3. 3レスポンスの項目
1/3
エンドポイント誰がいつ叩いたか。アクセスログで分かる。利用者ごとの内訳も取れる

アクセスログで分かるのはエンドポイントまで。項目を使っているかは相手の中の話で、こちらからは見えない。

バージョンを増やすと、保守が倍になる

「壊すならバージョンを上げればよい」は正しいのですが、v1 と v2 を両方動かし続けることになります。

  • 不具合の修正を両方に入れる
  • テストも両方
  • 内部の実装が分岐していく

バージョンは無料ではありません。 増やすほど、変更のたびの手間が増えます。

だから第一の選択は「バージョンを上げずに済む形にできないか」です。

演習 — まず自分で判断する

確認 — ここまで読めたか

次のうち、後方互換を壊さない変更はどれですか?

まず選ぶ(解答例は a〜d の記号で説明します)

確認 — ここまで読めたか

レスポンスから項目を1つ消したい。最初にやることは何ですか?

まず選ぶ(解答例は a〜d の記号で説明します)

読み終わりましたか?

読了にすると、これを前提とする記事がロードマップで開放されます。