API設計スキルを次のレベルに引き上げるベストプラクティス22選

本記事は、Mohammad Faisal氏による「[22 Best Practices to Take Your API Design Skills to the Next Level](https://betterprogramming.pub/22-best-practices-to-take-your-api-design-skills-to-the-next-level-65569b200b9)」（2021年4月15日公開）の和訳を、著者の許可を得て掲載しているものです。

#API設計スキルを次のレベルに引き上げるベストプラクティス22選
>REST API設計のための実践的アドバイス

![Rest API Design Best Practices](https://miro.medium.com/max/770/1*bGuAtdLThns0yU1pHHfwzA.jpeg)
Photo by [Andrea Piacquadio](https://www.pexels.com/@olly?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) from Pexels

##はじめに

すべてが分かりにくく、ひどいAPIに不満を感じたことはありませんか？私はそうです。

マイクロサービスの世界では、バックエンドAPIの一貫した設計が不可欠です。

今日は、知っておくべきベストプラクティスについて、簡潔に説明します。**さあ始めましょう！**

##用語

API設計は、[**リソース指向設計**](https://cloud.google.com/apis/design/resources)というものに従います。3つの重要な概念で構成されています。

-   **リソース**：データの一部（例：**ユーザー**）
-   **コレクション**：リソースのグループ（例：**ユーザーリスト**）
-   **URL**：リソースやコレクションの場所（例：`/user`）

##1. URLにケバブケースを使う

例えば、注文リストを取得する場合です。

**悪い**

```
/systemOrders or /system_orders
```

**良い**

```
/system-orders
```

##2. パラメータにキャメルケースを使う

例えば、特定のショップの商品を取得する場合です。

**悪い**

```
/system-orders/{order_id} or /system-orders/{OrderId}
```

**良い**

```
/system-orders/{orderId}
```

##3. コレクションを指す複数形の名前

システムの全ユーザーを取得する場合です。

**悪い**

```
GET /user or GET /User
```

**良い**

```
GET /users
```

##4. URLはコレクションで始まり、識別子で終わる

概念の単一性と一貫性を保つ場合です。

**悪い**

```
GET /shops/:shopId/category/:categoryId/price
```

リソースではなくプロパティを指しているため、よくありません。

**良い**

```
GET /shops/:shopId/ or GET /category/:categoryId
```

##5. リソースURLに動詞を使わない

URLで意図を表すために動詞を使わないでください。代わりに、適切なHTTPメソッドを使って操作を記述しましょう。

**悪い**

```
POST /updateuser/{userId} or GET /getusers
```

**良い**

```
PUT /user/{userId}
```

##6. 非リソースURLには動詞を使う

操作のみを返すエンドポイントの場合、動詞を使います。例えば、ユーザーにアラートを再送する場合です。

**良い**

```
POST /alerts/245743/resend
```

これはCRUD操作ではないことに注意してください。むしろ、システムで特定の仕事をする関数と考えられます。

##7. JSONのプロパティにキャメルケースを使う

リクエスト本文やレスポンスがJSONのシステムを構築している場合、プロパティ名は**キャメルケース**である必要があります。

**悪い**

```
{
user_name: "Mohammad Faisal"
user_id: "1"
}
```

**良い**

```
{
userName: "Mohammad Faisal"
userId: "1"
}
```

##8. モニタリング

RESTful HTTPサービスは、`/health`、`/version`、`/metrics`の各APIエンドポイントを実装する**必要があります**。これらは以下の情報を提供します。

**/health**

`/health`へのリクエストに`200 OK`ステータスコードで応答します。

**/version**

`/version`へのリクエストにバージョン番号で応答します。

`/metrics`

このエンドポイントは、平均応答時間などのさまざまなmetricsを提供します。

`/debug`と`/status`エンドポイントも強くおすすめします。

##9. リソース名にテーブル名を使わない

リソース名にテーブル名を使わないでください。長期的には、この種の怠慢は有害です。

**悪い**

```
product_order
```

**良い**

```
product-orders
```

基本的なアーキテクチャの公開が目的ではないからです。

##10. API設計ツールを使う

優れたドキュメントを作るためのAPI設計ツールがたくさんあります。

-   [API Blueprint](https://apiblueprint.org/)
-   [Swagger](https://swagger.io/)

![](https://miro.medium.com/max/770/1*wbtbNmxsgf-KuMzqOr18HA.png)
>Swagger

優れた詳細ドキュメントによって、API利用者にとって素晴らしいユーザーエクスペリエンスが得られます。

##11. バージョンに単純な序数を使う

APIに常にバージョン管理を使い、左に移動して範囲を広げます。バージョン番号は`v1`、`v2`などにします。

**良い**

```
http://api.domain.com/v1/shops/3/products
```

APIが外部エンティティに使われている場合、エンドポイントを変更するとその機能が使えなくなる可能性があるため、APIには常にバージョン管理を使ってください。

##12. レスポンスにリソースの総数を含める

APIがオブジェクトのリストを返す場合、必ずリソースの総数をレスポンスに含めてください。`total`プロパティを使います。

**悪い**

```
{
    users: [
        ...
    ]
}
```

**良い**

```
{
    users: [
        ...
    ],
    total: 34
}
```

##13. limitパラメータとoffsetパラメータを受け入れる

`GET`操作では、常に`limit`パラメータと`offset`パラメータを受け入れましょう。

**良い**

```
GET /shops?offset=5&limit=5
```

フロントエンドでのページネーションに必要だからです。

##14. fieldsクエリパラメータを使う

返されるデータ量も考慮する必要があります。`fields`パラメータを追加して、APIから必要なフィールドのみを公開します。

例えば、ショップ名、住所、連絡先のみを返す場合です。

```
GET /shops?fields=id,name,address,contact
```

場合によっては、レスポンスサイズの縮小にも役立ちます。

##15. URLに認証トークンを渡さない

これは非常に悪い習慣です。多くの場合、URLがログに記録され、認証トークンも不必要に記録されるからです。

**悪い**

```
GET /shops/123?token=some_kind_of_authenticaiton_token
```

**良い**

代わりに、ヘッダーで認証トークンを渡します。

```
Authorization: Bearer xxxxxx, Extra yyyyy
```

また、認証トークンは短命であるべきです。

##16. コンテンツタイプを有効にする

サーバーは、コンテンツタイプを憶測してはいけません。例えば、`application/x-www-form-urlencoded`を受け入れた場合、攻撃者はフォームを作成し、単純なPOSTリクエストをトリガーできます。

そのため、常に**コンテンツタイプ**を有効にし、デフォルトのものを使う場合は、`content-type: application/json`を使います。

##17. CRUD機能にHTTPメソッドを使う

HTTP メソッドは、CRUD機能を説明する目的で使います。

`GET`：リソースの表現を取得する

`POST`：新しいリソースやサブリソースを作成する

`PUT`：既存のリソースを更新する

`PATCH`：既存のリソースを更新する、提供されたフィールドのみを更新し、他のフィールドはそのままにする

`DELETE`：既存のリソースを削除する

##18. ネストされたリソースURLにリレーションを使う

実例です。

-   `GET /shops/2/products`：ショップ2の全商品リストを取得する
-   `GET /shops/2/products/31`：ショップ2の商品31の詳細を取得する
-   `DELETE /shops/2/products/31`：ショップ2の商品31を削除する
-   `PUT /shops/2/products/31`：商品31の情報を更新する、PUTはコレクションではなくリソースURLのみに使う
-   `POST /shops`：新しいショップを作成し、そのショップの詳細を返す、POSTはコレクションURLに使う

##19. CORS

全公開APIに対してCORS（Cross-Origin Resource Sharing）ヘッダーをサポートします。

CORSが許可した「*」のオリジンのサポートと、有効なOAuthトークンを使った認証の実施を検討してください。

ユーザー資格情報とオリジン認証の組み合わせは避けてください。

##20. セキュリティ

全エンドポイント、リソース、サービスにHTTPS（TLS暗号化）を適用します。

全コールバックURL、プッシュ通知エンドポイント、Webhookに、HTTPSを適用してリクエストします。

##21. エラー

エラー、厳密にはサービスエラーが発生するのは、クライアントがサービスに対して、無効または不正なリクエストを行ったり、無効または不正なデータを渡したりして、サービスがそのリクエストを拒否した時です。

例えば、無効な認証情報、不正なパラメータ、不明なバージョンIDなどです。

-   1つ以上のサービスエラーによりクライアントリクエストを拒否する場合は、`4xx` HTTPエラーコードを返す
-   全属性を処理してから、単一の応答で複数の認証問題を返すことを検討する

##22. ゴールデンルール

APIフォーマットの決定に迷った場合は、以下のゴールデンルールが正しい決定をする指針となります。

-   フラットはネストより良い
-   単純は複雑より良い
-   文字列は数字より良い
-   一貫性はカスタマイズより良い

##おわりに

これで終了です。ここまで読んだ方に、拍手を送ります！この記事から何かを学んでいただけたら嬉しいです。良い一日を！

何かありましたら、ぜひ[LinkedIn](https://www.linkedin.com/in/56faisal/)でご連絡ください。

>**Reactの16の問題を解決する45のNPMパッケージ**
>完璧なnpmパッケージの選び方を徹底解説
>[javascript.plainenglish.io](https://javascript.plainenglish.io/45-npm-packages-to-solve-16-react-problems-a9ab18946224)

### 

>**クリーンなReactプロジェクトの21のベストプラクティス**
>コード品質向上のための実践的アドバイス
>[betterprogramming.pub](https://betterprogramming.pub/21-best-practices-for-a-clean-react-project-df788a682fb)
>[qiita.com](https://qiita.com/baby-degu/items/ea4eede60bbe9c63a348)

##リソース

-   <https://github.com/elsewhencode/project-guidelines>
-   <https://cloud.google.com/apigee/>
-   <https://github.com/byrondover/api-guidelines/blob/master/Guidelines.md#json-api-specification>

##翻訳協力

この記事は以下の方々のご協力により公開する事ができました。改めて感謝致します。

Original Author: [Mohammad Faisal](https://56faisal.medium.com/) ([Linkedin](https://www.linkedin.com/in/56faisal/))
Original Article: [22 Best Practices to Take Your API Design Skills to the Next Level](https://betterprogramming.pub/22-best-practices-to-take-your-api-design-skills-to-the-next-level-65569b200b9)
Thank you for letting us share your knowledge!

選定担当: @gracen
翻訳担当: @gracen
監査担当: -
公開担当: @gracen

##ご意見・ご感想をお待ちしております
今回の記事はいかがでしたか？
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
頂いたお声は、今後の記事の質向上に役立たせて頂きますので、お気軽に
コメント欄にてご投稿ください。[Twitter](https://twitter.com/BabyDegu?lang=ja)でもご意見を受け付けております。
皆様のメッセージをお待ちしております。