だから私は、CMS に新しい、光沢のある REST Web サービスを追加しようとしています。REST の「ルール」に厳密に従う必要があるため、GET/POST/PUT/DELETE と適切な論理 URL を使用する必要があります。私のデザインは、Apigee のベスト プラクティスに大きく影響を受けています。
CMS はカテゴリのツリーを管理します。各カテゴリには多数の記事を含めることができます。多言語プロジェクトの場合、カテゴリは言語ごとに複製されます (そのため、記事はその ID と言語 ID によって一意に識別されます)。構造はすべての言語で同じで、位置のみが異なります (したがって、すべての言語でカテゴリ X にカテゴリ Y と Z が含まれますが、言語 1 では Y が Z の前にあり、言語 2 ではその逆になる可能性があります) 。新しい記事またはカテゴリを作成すると、常にすべての言語でコピーが作成されます。削除も同じように機能するため、記事は常にすべての言語で削除されます。
参考までに: 言語は、数値 ID またはロケール ( などen_US
) によって識別されます。
(すべての URI の前に先頭をイメージしてください/v1
。この質問には何も追加されないため、スキップしました。)`
私の現在のアプローチは、次のような URL スキームを使用しています。
GET /articles :( returns all articles in all languages
GET /articles/:id-:langid :) returns a single article in a given language
POST /articles :) creates a new article
PUT /articles/:id-:langid :) update a single article in a given language
DELETE /articles/:id :) delete an article in all languages
しかし...
言語を識別する方法は?
現在、各言語に割り当てられているロケールは一意である必要はないため、まれに 2 つの言語が同じロケールを持つことがあります。ID を使用すると、一意であることが保証されます。
URL が読みやすくなるため、ロケール (ほとんどの場合、強制的に小文字にする) を使用すると便利です。しかし、これは
- ロケールが重複するプロジェクトにつながる可能性があります。
- クライアントは最初にロケールを取得する必要があります (ただし、クライアントはとにかく言語 ID を取得する必要があると思いますので、それで問題ありません)。
これに対する正確な解決策を1つにして、ロケールを使用する傾向があります。しかし、重複するロケールを危険にさらす価値はありますか?
langid=X
(以下で交換可能な画像を作成できlocale=xx_xx
ます。)
言語は階層要素であるべきか?
ほとんどの場合、API のクライアントは、すべてではなく特定の言語の記事を取得する必要があります。GET パラメータと offer を許可することで、これを解決できましたGET /articles?langid=42
。しかし、非常に一般的なユースケースであるため、オプションのパラメーターを避けて明示的にしたいと思います。
これは につながりますがGET /articles/:langid
、これにより、言語は API 内の階層レベルであるという概念が導入されます。やるなら他の動詞も統一したい。新しい URL レイアウトは次のようになります。
GET /articles/:langid :) returns all articles in a given language
GET /articles/:langid/:id :) returns a single article in a given language
POST /articles :( creates a new article in all languages
PUT /articles/:langid/:id :) update a single article in a given language
DELETE /articles/:langid/:id :( delete an article in all languages
また
GET /:langid/articles :) returns all articles in a given language
GET /:langid/articles/:id :) returns a single article in a given language
POST /articles :( creates a new article in all languages
PUT /:langid/articles/:id :) update a single article in a given language
DELETE /:langid/articles/:id :( delete an article in all languages
これはにつながります...
グローバルアクションをどうするか?
上記のレイアウトには問題がPOST
ありDELETE
、すべての言語で機能しますが、URL は 1 つの言語でしか機能しないことを示唆しています。したがって、レイアウトを変更できます。
GET /articles/:langid :) returns all articles in a given language
GET /articles/:langid/:id :) returns a single article in a given language
POST /articles :) creates a new article in all languages
PUT /articles/:langid/:id :) update a single article in a given language
DELETE /articles/:id :) delete an article in all languages
これは、言語レベルが時々しか存在せず、システムの内部について多くのことを知る必要があるため、やや混乱したレイアウトになります。明るい面では、これはシステムと非常によく一致し、内部の仕組みと非常によく似ています.
犠牲?
では、どこで犠牲を払うのですか?見栄えの良い URL レイアウトを実現するためにエイリアス URL を導入する必要がありますが、バックグラウンドで意図しないことを行う必要がありますか?