本文へ移動

ホーム / Web / 第4部 バックエンド

第4部 バックエンド・第8章

API 設計

★★★ 必須11トピック・面接 5問

フロントやスマホ、他のサービスから使いやすく、壊れにくい API の作り方を押さえる。

ひとことで

URL でリソースを表し、メソッドで操作を表す。ステータスコードで結果を伝える。

REST は、URL でリソース(もの)を表し、HTTP メソッドで操作を表す設計のスタイルです。HTTP の決まりに沿うので、キャッシュ・リトライ・監視などの仕組みをそのまま使えます。

URL はリソースの名詞で、ネストは1段まで/usersGET 一覧・POST 作成/users/{id}GET・PATCH・DELETE/users/{id}/orders子は1段まで/users/{id}/orders/{oid}/items深すぎる:親の ID がないと使えない/orders/{oid}/items注文から直接たどるこうする
URL のネストは1段まで

URL の命名・ネスト

操作メソッドと URL成功時
一覧GET /users?status=active&limit=20200
1件GET /users/42200(なければ 404)
作成POST /users201 + Location
一部更新PATCH /users/42200
削除DELETE /users/42204
子のリソースGET /users/42/orders200
動作(REST で表しにくいもの)POST /orders/7/cancel200 / 202
  • 名詞の複数形にし、動詞(/getUser)は入れない。小文字とハイフン、またはチーム内で決めた形に統一する。
  • ネストは1段まで(/users/42/orders)。深くすると URL が長くなり、親の ID が無いと使えなくなる。2段以上は /orders?user_id=42 のように絞り込みで表す。
  • JSON のキーの形(snake_case か camelCase)、日時(ISO 8601、UTC)もそろえる。

OpenAPI の基本の形(API の仕様書の章)

面接ではこう答える

REST は、URL でリソースを表し、HTTP のメソッドで操作を表す設計のスタイルです。URL は名詞の複数形にし、ネストは1段までにして、深い絞り込みはクエリで表します。作成は POST で 201 と Location、削除は 204 のように、ステータスコードで結果を伝えます。HTTP の決まりに沿うので、キャッシュやリトライ、監視の仕組みをそのまま使えます。

ひとことで

エラーの本文の形を API 全体でそろえる。RFC 9457(Problem Details)が標準の形で、機械が判定する code を持たせる。

人に見せる文言と、機械が判定する code を分けるステータスコード・大まかな結果・監視・リトライの判断・422・409・429 などcode・機械が判定する理由・invalid_format など・画面の分岐に使うtitle・detail・人が読む説明・翻訳・文言の変更OK・内部の詳細は出さない
エラーの応答に入れる3つの層

エラーの本文の形を API 全体でそろえると、クライアントが共通の処理を書けます。RFC 9457(Problem Details)は、その標準の形です。

HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json

{
  "type": "https://example.com/problems/validation",
  "title": "入力内容に誤りがあります",
  "status": 422,
  "detail": "email の形式が正しくありません",
  "errors": [{ "field": "email", "code": "invalid_format" }]
}

画面に出す文言とは別に、機械が判定できる code を持たせます。500 の詳細(スタックトレース・SQL)は返さず、代わりにログと結びつける ID(リクエスト ID)を返します。

返してはいけないもの代わりに
スタックトレース・SQL・内部のホスト名リクエスト ID(ログと結びつける)
「このメールアドレスは登録済み」(ログイン画面で)登録の有無が分からない文言
すべてのエラーを 200 で正しいステータスコード

面接ではこう答える

API のエラーは、正しいステータスコードに加えて、本文の形を API 全体でそろえます。標準の形として RFC 9457 の Problem Details があり、type・title・status・detail を持たせます。画面の分岐は文言ではなく機械が判定できる code で行うようにし、入力エラーは項目ごとに返します。500 の詳細は返さず、ログと結びつけるリクエスト ID を返します。

8.3GraphQL・gRPC

用語★★☆ 重要
ひとことで

GraphQL は取得する項目をクライアントが選べ、gRPC は型付きで速いサービス間通信に向く。

項目RESTGraphQLgRPC
形リソースごとの URL1つのエンドポイントにクエリを送る関数の呼び出し(.proto で定義)
データJSON が多いJSON。欲しい項目だけ指定できるProtocol Buffers(バイナリ・小さく速い)
向いているもの公開 API・一般的な Web API画面ごとに必要なデータが違う、複数のクライアント(Web・App)サービス同士の内部通信、ストリーミング
HTTP キャッシュ効きやすいPOST が多く効きにくい使わない
ブラウザからそのままそのままそのままは難しい(gRPC-Web・Connect などが必要)

GraphQL の N+1 と、その対策の DataLoader は次のトピックで扱います。

GraphQL は「取りすぎ・足りない」を防げますが、クエリが自由なぶん、重いクエリへの対策(深さや複雑さの上限)、権限の確認をフィールドごとに考える必要があります。gRPC は型が厳密で速いので、マイクロサービスの間でよく使われます。

面接ではこう答える

REST、GraphQL、gRPC は用途で使い分けます。REST は公開 API や一般的な Web の API に向き、HTTP キャッシュが効きやすいです。GraphQL はクライアントが欲しい項目を選べるので、画面ごとに必要なデータが違う Web と App の両方に向きますが、重いクエリと権限の確認に気を配ります。gRPC は .proto で型を決めたバイナリの通信で速く、サービス同士の内部の通信に向いています。

8.4GraphQL の N+1 と DataLoader

用語★★☆ 重要
ひとことで

GraphQL のリゾルバーが1件ずつ DB を引く N+1 を、同じタイミングの取得をまとめて1回の IN にする DataLoader で防ぐ。

リゾルバーごとに SQL を出すか、まとめるかそのままだと SQL が 1+20 回DataLoader で 1+1 回著者のリゾルバー20回呼ばれるDBid = 1id = 2id = 3id = 4…(20回)著者のリゾルバー20回呼ばれるDataLoaderまとめるDBIN (…) の1回に
GraphQL の N+1 と DataLoader

GraphQL ではフィールドごとに解決する関数(リゾルバー)が呼ばれます。記事 20 件と、それぞれの著者を取るクエリだと、著者のリゾルバーが 20 回呼ばれ、素直に書くと SQL が 1+20 回になります。

DataLoader は、同じタイミングで呼ばれた「著者 ID で取って」をまとめて、WHERE id IN (…) の1回にする仕組みです。リクエストごとに作り直すことで、他のユーザーとキャッシュが混ざらないようにします。

GraphQL ではあわせて、クエリの深さや複雑さの上限、1回に返す件数の上限を決めて、重いクエリで DB が倒れないようにします。

面接ではこう答える

GraphQL では、フィールドごとにリゾルバーという関数が呼ばれます。記事20件とそれぞれの著者を取ると、著者のリゾルバーが20回呼ばれ、素直に書くと SQL が1足す20回になります。DataLoader は、同じタイミングで呼ばれた ID をまとめて WHERE id IN の1回にする仕組みで、リクエストごとに作り直して他のユーザーとキャッシュが混ざらないようにします。

8.5ページング

用語★★★ 必須
ひとことで

OFFSET 方式は後ろほど遅く、カーソル(キーセット)方式は何ページ目でも速い。

一覧の API は、件数が増えても速く返せるよう、少しずつ返す(ページング)のが前提です。limit の上限(例:100)も必ず決めます。

3ページ目(41〜60件目)を取るとき、DB が読む行1マス=5行オフセットOFFSET 40カーソルid < 123先頭の 40 行も読んでから捨てる(深いページほど遅い)インデックスで続きの位置に直接飛び、20 行だけ読む■ 返す行
オフセット方式とカーソル方式の読み方の違い
オフセット方式カーソル方式
リクエスト?page=3&per_page=20(OFFSET 40)?after=eyJpZCI6MTIzfQ&limit=20
SQLORDER BY id LIMIT 20 OFFSET 40WHERE id < 123 ORDER BY id DESC LIMIT 20
深いページの速さ遅くなる(読み飛ばす行も DB は読む)インデックスで直接たどれるので一定
途中で追加・削除があると重複や抜けが出る出にくい
好きなページに飛ぶできるできない(前後に進むだけ)
向いているもの件数の少ない管理画面・総ページ数を出したい所タイムライン・無限スクロール・大きな表

面接ではこう答える

ページングには、OFFSET で何件読み飛ばすかを指定する方式と、最後に返した行のキーから続きを取るカーソル方式があります。OFFSET は好きなページに飛べますが、深いページほど DB が読み飛ばす行も読むので遅くなり、途中の追加で重複や抜けが出ます。カーソル方式はインデックスで直接たどれるので何ページ目でも速く、タイムラインや無限スクロールに向きます。

別のページで開く →

DBラボを読み込んでいます…

最後の行のキーを、中身を見せない文字列にして返す最後の行(created_at, id)JSON にする{"t":…,"id":123}Base64 で包む必要なら署名next_cursorクライアントは渡すだけ
カーソルを作る流れ

カーソルは「最後に返した行の、並び順のキーの値」です。並び順のキーは一意でなければなりません。created_at だけだと同じ時刻の行で抜けや重複が起きるので、id と組み合わせます。

-- 新しい順。前のページの最後が (2026-11-01 10:00, 123)
SELECT * FROM posts
WHERE (created_at, id) < ('2026-11-01 10:00', 123)
ORDER BY created_at DESC, id DESC
LIMIT 21;  -- 1件多く取り、次があるか判定する
-- インデックス:(created_at, id)

この値を JSON にして Base64 で包み、クライアントには中身を気にせず渡すだけの文字列として返します("next_cursor": "…")。中身に頼らせないことで、後から並び順の作りを変えられます。改ざんされたカーソルで困る場合は署名を付けます。行の比較 (a, b) < (x, y) が使えない DB では a < x OR (a = x AND b < y) と書きます。

別のページで開く →

DBラボを読み込んでいます…

8.7冪等性と冪等キー

用語★★★ 必須
ひとことで

同じリクエストを何度送っても結果が1回分になる性質。決済など POST は冪等キーで守る。

決済・注文・メール送信のような「1回だけ起きてほしい」処理では、やり直しによる二重の実行が、お金や信用に関わる事故になります。同じリクエストが2回届く道は、利用者のボタンの連打、スマホの回線の切れ、クライアントのライブラリやプロキシによる自動のリトライなど、いくつもあります。

冪等性は、リトライを安全にするための API 設計の基本で、面接でも定番の話題です。

通信は失敗します。クライアントがタイムアウトしたとき、サーバーが「処理する前に落ちた」のか「処理は終わったが応答が届かなかった」のかは区別できません。そのため、同じリクエストを何回送っても結果が1回分になる(冪等)ようにしておくと、安全にリトライできます。

メソッドとリトライ

GET・PUT・DELETE はもともと冪等なので、そのままリトライしてかまいません。POST(作成・決済・メール送信)は冪等ではないので、何もしないと二重に作られます。

冪等キーの仕組み

クライアントが操作ごとに一意のキー(UUID)を作り、リトライのときも同じキーを送ります。

POST /payments
Idempotency-Key: 6f1c2e8a-...
{"amount": 1200, "order_id": 77}
応答が失われても、同じキーなら1回分の結果クライアントAPI サーバーDB(キーの表)POST /payments Idempotency-Key: K1K1 を保存(一意制約)・決済を実行応答が途中で失われる(タイムアウト)同じ K1 でリトライPOST /payments Idempotency-Key: K1K1 はもうある → 保存した結果を読む201(1回目と同じ結果)。二重に決済しない
冪等キーでリトライを安全にする流れ
  • サーバーはキーを一意制約つきの表に保存し、同時に来た2つ目は保存に失敗するので、処理中なら 409 を返す。
  • 処理が終わったら、ステータスと応答の本文をキーと一緒に保存する。
  • 同じキーがまた来たら、処理をせず保存しておいた応答を返す。
  • 同じキーなのに中身が違うリクエストは 422 などで拒否する。キーは 24 時間など期限を決めて消す。

キーの保存と本来の処理(注文の作成)は、同じトランザクションで行うと食い違いません。外部の決済サービスを呼ぶときは、そちらにも冪等キーを渡します(多くの決済 API が対応しています)。

下の「ブラウザで試す」の図では、アプリが冪等キー付きで注文を送り、サーバーが注文とキーを同じトランザクションで保存したあと、返事が途中で消えます。アプリは間をあけて同じキーで送り直し、サーバーは処理済みのキーだと分かるので、注文を作り直さずに前回の結果を返します。上の箇条書きの「同じキーがまた来たら、保存しておいた応答を返す」の手順に注目してください。同時に2つ届いたときの 409 や、中身が違うときの 422 は図には出てきません。

面接ではこう答える

冪等性は、同じリクエストを何回送っても結果が1回分になる性質です。タイムアウトしたとき、処理されたかどうかはクライアントには分からないので、冪等にしておけば安全にリトライできます。決済のような POST では、クライアントが操作ごとに冪等キーを作り、リトライでも同じキーを送ります。サーバーはキーを一意制約つきで保存し、2回目以降は保存しておいた応答を返します。

別のページで開く →

ネットワーク図を読み込んでいます…

ひとことで

直る見込みのある失敗だけを、冪等なときに、指数バックオフ+ジッターで回数を限ってやり直す。

間隔を倍々に広げ、ばらつきを足して、同時のやり直しを避ける失敗1回目(1秒後)2回目(2秒後)3回目(4秒後)諦める(上限)黄色の幅=ジッター(ランダムなずれ)。全員が同じ瞬間にやり直さない
指数バックオフとジッター
結果リトライ
タイムアウト・接続エラー冪等な操作か、冪等キー付きなら、する
429・503する。Retry-After があれば従う
500・502・504冪等なら数回まで
400・401・403・404・422しない(送り直しても直らない)
409(処理中)少し待って同じキーで
  • 間隔は指数バックオフ+ジッター(1秒・2秒・4秒…にばらつきを足す)。全員が同時にリトライすると、復旧しかけたサーバーを再び倒す。回数にも上限を付ける。
  • ジョブのキューも「少なくとも1回」届く前提なので、ワーカー側も冪等に作る。

リトライは、呼ぶ側の全部の層で重ねると回数が掛け算になります(3層 × 3回 = 最大 27回)。リトライはできるだけ1か所(一番外側か、一番内側)にまとめます。

面接ではこう答える

リトライしてよいのは、タイムアウトや 503 のように時間がたてば直る見込みがある失敗で、しかも操作が冪等か冪等キー付きのときです。400 や 404 は送り直しても直らないのでやり直しません。間隔は指数バックオフにジッターを足して、全員が同時にやり直さないようにし、回数にも上限を付けます。層ごとにリトライを重ねると回数が掛け算になるので、1か所にまとめます。

ひとことで

使っているクライアントを壊さないように変更する。項目の追加は安全、削除や意味の変更は危険。

公開した API は、使っている側(スマホのアプリ・他社)がすぐには更新できないので、壊さずに変えるのが基本です。

  • 壊さない変更:項目の追加、任意のパラメータの追加、新しいエンドポイント。クライアントは知らない項目を無視するように作る。
  • 壊す変更:項目の削除・名前の変更・型の変更、必須パラメータの追加、エラーの形の変更、列挙値の追加(クライアントが想定していないと壊れることがある)。

バージョンの付け方

方法例特徴
URL/v1/users分かりやすく、ログやルーティングで見分けやすい。一番よく使われる
ヘッダーAccept: application/vnd.example.v2+json、独自ヘッダーURL がきれいだが、試しにくい
日付の版API-Version: 2026-10-01細かく変えられる。アカウントごとに版を固定する API もある

大きな版(v2)を作るのは最後の手段です。2つの版を同時に保守する手間がかかるので、まずは追加で対応できないか考えます。

面接ではこう答える

公開した API は、使っている側がすぐには更新できないので、壊さずに変えるのが基本です。項目や任意のパラメータの追加は安全ですが、削除や名前・型の変更、必須の追加は壊す変更です。バージョンは URL に付ける方法が一番わかりやすく、ほかにヘッダーや日付の版もあります。2つの版を保守する手間がかかるので、新しい版は最後の手段にします。

古い版の利用を減らしてから止める古い版の利用告知移行先・期限ヘッダーで予告Deprecation・Sunset利用者に連絡ログで数える短く止めて確認ブラウンアウト停止利用がほぼ 0
API の廃止の進め方(期間は数か月以上)
  • 廃止の予定と移行先を告知し、期限(数か月以上)を決める。
  • 応答に Deprecation・Sunset ヘッダーで廃止予定を示す。
  • 古い版・古い項目の利用をログで数え、利用者に個別に連絡する。
  • アプリの場合は、強制アップデートの仕組みと組み合わせる。
  • 利用がほぼなくなってから止める。一時的に止めて反応を見る(短いブラウンアウト)方法もある。
Deprecation: @1767225600
Sunset: Wed, 30 Jun 2027 00:00:00 GMT
Link: <https://example.com/docs/migrate-v2>; rel="deprecation"

Sunset ヘッダーは RFC 8594、Deprecation ヘッダーは RFC 9745 で決められています。値は日付で、移行の手順のページへのリンクも添えると親切です。

8.11レート制限

用語★★☆ 重要
ひとことで

一定時間に送れる回数を決め、超えたら 429 を返して、総当たりや連打からサービスを守る仕組み。

公開した API やログイン画面には、正しい利用者だけでなく、パスワードを総当たりするボットや、バグで同じリクエストを連打するクライアントも来ます。何も制限しないと、一部の相手のせいで DB やサーバーが埋まり、全員が使えなくなります。

レート制限はその守りの基本で、API の設計・セキュリティ・障害対応のどれでも出てくる話題です。

数え方で、窓の切れ目の挙動が変わる固定窓・1分ごとに数え直す・INCR と EXPIRE で簡単・切れ目で最大2倍通るスライディング窓・直近1分を数える・切れ目の偏りがない・ソート済みセットなどトークンバケット・一定の速さで補充・短い集中を許す・多くの API で使われる
レート制限の3つの数え方

レート制限は、1人(またはキー・IP)が一定時間に送れる回数を決めて、超えたら 429 Too Many Requests を返す仕組みです。総当たりのログイン・スクレイピング・バグったクライアントの連打から、サービス全体を守ります。

決めること例
数える単位ログイン前は IP、ログイン後はユーザー ID・API キー
上限一般の API は 1分 60回、ログインの試行は 1時間 10回など、操作ごとに
超えたときの応答429 + Retry-After。残り回数をヘッダーで返す API も多い
数える場所複数台のサーバーで共有するため Redis。入口の WAF・API Gateway でも

多くの台数で共有するカウンターは Redis の INCR が原子的なので、数え間違えません。実装は Redis の使い方で試せます。

SRE の「レート制限のアルゴリズム」

下の「ブラウザで試す」の図では、API サーバーが2台ある構成で、1つのリクエストが LB と API を通り、Redis に回数を問い合わせてから 200 か 429 が返るまでを追えます。台ごとに数えると上限が台数倍になること、固定ウィンドウ・スライディングウィンドウ・トークンバケットで Redis に送るコマンド(INCR・ソート済みセット・Lua スクリプト)がどう違うかを、上の図の3つの数え方と見比べてください。429 に付ける Retry-After と残り回数のヘッダー、表の「数える単位」(ログイン前は IP、ログイン後はユーザー ID・API キー)、Redis が落ちたときに通すか止めるかの手順もあります。

面接ではこう答える

レート制限は、ユーザーや API キー、IP ごとに一定時間の回数の上限を決め、超えたら 429 と Retry-After を返す仕組みです。数え方には、簡単な固定窓、切れ目の偏りがないスライディング窓、短い集中を許すトークンバケットがあります。複数台のサーバーで共有するため、カウンターは Redis の INCR のような原子的な操作で数えます。ログインのような操作は特に厳しくします。

別のページで開く →

ネットワーク図を読み込んでいます…

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • REST の設計(リソース・メソッド・ステータス)と、GraphQL・gRPC との使い分け
  • ページング・冪等性・エラー・バージョニングを設計できる
  • REST の設計(リソースと URL):URL でリソースを表し、メソッドで操作を表す。ステータスコードで結果を伝える。
  • エラーの返し方(Problem Details):エラーの本文の形を API 全体でそろえる。RFC 9457(Problem Details)が標準の形で、機械が判定する code を持たせる。
  • GraphQL・gRPC:GraphQL は取得する項目をクライアントが選べ、gRPC は型付きで速いサービス間通信に向く。
  • GraphQL の N+1 と DataLoader:GraphQL のリゾルバーが1件ずつ DB を引く N+1 を、同じタイミングの取得をまとめて1回の IN にする DataLoader で防ぐ。
  • ページング:OFFSET 方式は後ろほど遅く、カーソル(キーセット)方式は何ページ目でも速い。
  • 冪等性と冪等キー:同じリクエストを何度送っても結果が1回分になる性質。決済など POST は冪等キーで守る。
  • リトライしてよいかの判断とバックオフ:直る見込みのある失敗だけを、冪等なときに、指数バックオフ+ジッターで回数を限ってやり直す。
  • バージョニングと後方互換:使っているクライアントを壊さないように変更する。項目の追加は安全、削除や意味の変更は危険。
  • レート制限:一定時間に送れる回数を決め、超えたら 429 を返して、総当たりや連打からサービスを守る仕組み。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1REST API を設計するときに気をつけることは?

模範回答

まずリソースを名詞で整理し、URL は複数形の名詞、操作はメソッドで表します。ネストは1段までにして、それ以上は絞り込みのパラメータにします。ステータスコードは 201・204・404・409・422 などを意味どおりに返し、エラーの本文は RFC 9457 のような共通の形にそろえ、機械が判定できるコードを入れます。

一覧には最初からページングと limit の上限を付け、大きくなりそうならカーソル方式にします。POST の決済などには冪等キーを受けられるようにします。そして公開したら壊さずに変えるのが前提なので、項目は追加で対応し、削除や名前の変更は廃止の告知と期間を設けて進めます。仕様は OpenAPI で書き、レビューと型の生成に使います。

深掘りされたら

  • エラーの形をそろえるとクライアントは何がうれしいですか?

見られているポイントリソース設計・ステータス・エラー・ページング・互換性

Q2決済 API の二重実行をどう防ぎますか?

模範回答

クライアントに操作ごとの冪等キー(UUID)を作ってもらい、リトライのときも同じキーを Idempotency-Key ヘッダーで送ってもらいます。サーバーはキーを一意制約つきの表に保存し、処理の結果も一緒に記録します。同じキーが来たら処理をせず、保存した結果を返します。同時に2つ届いても、一意制約で片方だけが通り、もう片方は処理中として 409 を返せます。

さらに注文 ID に対して決済は1件だけ、という一意制約を DB に置いておくと、キーの扱いに漏れがあっても二重の決済の記録はできません。外部の決済サービスを呼ぶときもそちらの冪等キーを渡し、タイムアウトした場合は同じキーで問い合わせるかリトライして、結果を確かめてから次に進みます。

深掘りされたら

  • 冪等キーはどのくらいの期間保存しますか?
  • 同じキーで中身が違うリクエストが来たら?

見られているポイント冪等キーと DB の一意制約

Q3一覧 API のページングは、オフセットとカーソルのどちらを選びますか?

模範回答

件数が多い、新しいデータがどんどん増える一覧ならカーソル方式を選びます。オフセット方式は深いページほど DB が読み飛ばす行も読むので遅くなり、途中で行が増えると重複や抜けが出ます。カーソル方式は、最後に返した行の並び順のキーから続きを読むので、インデックスで直接たどれて速さが一定です。

一方で、管理画面のように件数が少なく、「5ページ目に飛ぶ」や総ページ数の表示が必要ならオフセットでも構いません。カーソルは並び順のキーを一意にする必要があり、created_at と id を組み合わせます。どちらでも limit の上限は必ず付けます。

深掘りされたら

  • カーソルの中身をクライアントに見せないのはなぜですか?

見られているポイントトレードオフと、カーソルのキーの一意性

Q4REST・GraphQL・gRPC はどう使い分けますか?

模範回答

公開 API や一般的な Web の API は REST を選ぶことが多いです。HTTP の仕組み(キャッシュ・ステータスコード)をそのまま使え、誰でも使いやすいからです。GraphQL は、画面ごとに欲しいデータが違う、Web とスマホなど複数のクライアントがある、といった場合に向いていて、取りすぎや足りないを防げます。

gRPC は型が厳密で速く、ストリーミングもできるので、サービス同士の内部の通信に向いています。ブラウザから直接使うには工夫が要ります。GraphQL は重いクエリへの対策やフィールドごとの権限、N+1 への DataLoader が必要になるので、その運用の手間も含めて選びます。

深掘りされたら

  • GraphQL で HTTP キャッシュが効きにくいのはなぜですか?

見られているポイント向いている場面と、選んだときの負担

Q5スマホアプリも使っている API の項目名を変えたいです。どう進めますか?

模範回答

アプリは利用者がすぐに更新しないので、古い項目をいきなり消すと古いアプリが壊れます。まず新しい名前の項目を追加し、しばらくは古い項目と両方を返します。新しいアプリは新しい項目を使うようにリリースします。

そのうえで古い項目の利用をログやアプリの版ごとの利用者数で数え、十分に減ったら廃止の予定を告知して、期限を過ぎてから消します。応答に Deprecation や Sunset ヘッダーを付ける方法もあります。どうしても互換性を保てない大きな変更のときだけ、新しいバージョンのエンドポイントを作ります。

深掘りされたら

  • 強制アップデートはどんなときに使いますか?

見られているポイント追加→移行→計測→廃止の順