URLの外観はRESTとは関係ありません。何でもあり。これは実際には「実装の詳細」です。変数に名前を付ける方法と同じです。彼らがしなければならないすべては、ユニークで耐久性があります。
これに多くの時間を無駄にしないでください。選択を行い、それに固執する/一貫性を保つだけです。たとえば、階層を使用する場合、すべてのリソースに対してそれを行います。クエリパラメータを使用する場合...コード内の命名規則と同じように。
なんでそうなの ?私が知る限り、「RESTful」APIはブラウズ可能です(ご存知のように...「アプリケーション状態のエンジンとしてのハイパーメディア」)。したがって、APIクライアントは、URLがどのようなものであるかを気にしません有効(デバッグ用の場合を除いて、これらの「フレンドリーなURL」を読み取る必要のあるSEOや人間は存在しません...)
コード内の変数の名前がそうであるように、REST APIでのURLの素晴らしさや理解しやすさは、APIクライアントではなく、API開発者としてのみ興味があります。
最も重要なことは、APIクライアントがメディアタイプを解釈する方法を知っていることです。たとえば、それはそれを知っています:
- メディアタイプには、使用可能な/関連するリンクをリストするリンクプロパティがあります。
- 各リンクは関係によって識別されます(ブラウザがlink [rel = "stylesheet"]がそのスタイルシートを意味するか、rel = favicoがファビコンへのリンクであることを知っているように...)
- そして、それらの関係の意味がわかっています(「会社」は会社のリストを意味します。「検索」はリソースのリストを検索するためのテンプレート化されたURLを意味します。「部署」は現在のリソースの部門を意味します)
以下はHTTP交換の例です(記述しやすいため、ボディはyamlにあります)。
リクエスト
GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml
応答:メインリソースへのリンクのリスト(会社、人、何でも...)
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: this is your API's entrypoint (like a homepage)
links:
# could be some random path https://api.acme.local/modskmklmkdsml
# the only thing the API client cares about is the key (or rel) "companies"
companies: https://api.acme.local/companies
people: https://api.acme.local/people
リクエスト:企業へのリンク(以前のレスポンスのbody.links.companiesを使用)
GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml
応答:(アイテムの下の)会社の部分的なリスト。リソースには、次の2つの会社を取得するためのリンク(body.links.next)、検索のための他の(テンプレート化された)リンク(body.links.search)などの関連リンクが含まれます。
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: representation of a list of companies
links:
# link to the next page
next: https://api.acme.local/companies?page=2
# templated link for search
search: https://api.acme.local/companies?query={query}
# you could provide available actions related to this resource
actions:
add:
href: https://api.acme.local/companies
method: POST
items:
- name: company1
links:
self: https://api.acme.local/companies/8er13eo
# and here is the link to departments
# again the client only cares about the key department
department: https://api.acme.local/companies/8er13eo/departments
- name: company2
links:
self: https://api.acme.local/companies/9r13d4l
# or could be in some other location !
department: https://api2.acme.local/departments?company=8er13eo
したがって、リンク/リレーションの方法を確認すると、URLのパス部分を構造化する方法は、APIクライアントにとって何の価値もありません。また、URLの構造をドキュメントとしてクライアントに伝えている場合は、RESTを実行していません(少なくとも、「リチャードソンの成熟度モデル」によるレベル3ではありません)。