第28回: APIバージョニング — 既存クライアントを壊さずに進化させる
レスポンスのフィールド名を変えたり、必須パラメータを追加したりすると、既存のモバイルアプリやフロントエンドが動作しなくなります。全クライアントが同時にアップデートできるとは限りません。
Month
レスポンスのフィールド名を変えたり、必須パラメータを追加したりすると、既存のモバイルアプリやフロントエンドが動作しなくなります。全クライアントが同時にアップデートできるとは限りません。
認証なしのAPIエンドポイントは、悪意のある大量リクエストや誤ったループ処理によって、サーバーリソースが枯渇する危険があります。結果として、全ユーザーへのサービス品質が低下します。
複数サーバーで負荷分散するAPIや、モバイルアプリとWeb API間の認証では、サーバー側にセッションを持つと状態管理が複雑になります。「どのサーバーがセッションを持っているか」を共有するためにRedisやスティッキーセッションが必要になるからです。
/api/users エンドポイントを作ったとき、認証がなければ世界中の誰でもアクセスできてしまいます。ユーザーデータや機密情報を扱うAPIには必ず「このリクエストは誰から来ているか」を確認する仕組みが必要です。
if (empty($request->title)) { return error(); } をコントローラに書き続けると、バリデーションロジックが散らばり、テストも困難になります。複数のエンドポイントで同じルールが重複し、変更のたびに複数箇所を修正しなければなりません。
エラーがあっても { “success”: false } を200で返すAPIがあります。クライアントはHTTPステータスだけでは「成功か失敗か」が分からず、常にJSONのパースが必要になります。
成功時は { “user”: {…} }、エラー時は { “msg”: “error” }、別のエンドポイントでは { “result”: “OK” } ——。
URLにアクション名を含めるAPI設計は、慣れれば作れても「APIを使う側」にとっては覚えるルールが増えるだけです。
ユーザーが投稿を削除したあと、「やっぱり復元したい」と言われたら?法的な理由でデータを保持しなければならない場合は?物理削除(レコードの完全消去)は取り返しがつきません。
開発者Aはユーザーを手動で5件登録している。開発者BはDB初期化後に1件しかない。CI環境には何もない——。こうした「環境ごとのデータ差異」がテスト結果の不一致や、動作確認の手戻りを引き起こします。