REST URI規約-作成中のリソースの単数形または複数形の名前


529

RESTは初めてですが、一部のRESTfulサービスでは、更新/取得/削除と作成に異なるリソースURIを使用していることがわかりました。といった

  • 作成-使用/リソースを使用していくつかの場所で、POSTメソッド(複数の観察)で/リソースを(単数形)
  • 更新-PUTメソッドで/ resource / 123を使用
  • Get- GETメソッドで/ resource / 123を使用する

このURIの命名規則について少し混乱しています。リソースの作成には、複数形または単数形を何を使用すればよいですか?それを決定する際の基準は何ですか?


9
このトピックに続いて、有名なREST APIの例をいくつか記事にまとめました:inmensosofa.blogspot.com/2011/10/…
jjmontes

3
以下のすべての回答を読んだ後の結論:(a)一貫している、(b)単数のクラス名とテーブル名に直接マッピングされる、(c)英語で複数の名詞が不規則(予測できない)であるため、常に単数形を使用する
ウィルシェパード

単数形のテーブルの命名規則へのリンクについては、この回答を参照してください。この正確な問題について言及する別の記事がありますRest API開発者のジレンマ -@Sorterに感謝
Will Sheppard

回答:


281

使用の前提/resourcesは、「すべての」リソースを表すことです。を実行するとGET /resources、コレクション全体が返される可能性があります。にPOSTすると/resources、コレクションに追加されます。

ただし、個々のリソースは/ resourceで利用できます。を実行するとGET /resource、このリクエストは意味を成さない/resource/123が完全に意味をなすため、エラーが発生する可能性があります。

/resource代わりにを使用するの/resourcesは、たとえばファイルシステムとファイルのコレクションを操作/resourceしていて、その中に個別の123456ファイルがある「ディレクトリ」である場合の方法と似ています。

どちらの方法も正しいか間違っている、あなたが一番好きなもので行きます。


55
正解です。しかし、Windowsの「デフォルト」ディレクトリには複数の名前があります。「プログラムファイル」、「ユーザー」、「ドキュメント」、「ビデオ」などと同様に、WebサイトのURLで複数の名前に遭遇することが多くなりました。
Dmitry Gonchar 2013

50
デファクトコンベンションでは、ほとんどの人やAPIが常に複数を維持しています。IDは1つのリソース車/ IDを指定します
PositiveGuy

205
「どちらの方法も正しいか間違っている、あなたが一番好きなもので行く。」。あの有名なセリフはよく耳にしますし、人からの聞き取りにうんざりしてうんざりします。条約は重要であり、コミュニティの間で建設的に議論されるべきです。URIのリソース名に複数と単数の両方を使用している場合、ユーザーとAPIの背後にあるコードは、ルートとロジックでそれを考慮して単数と複数を区別する必要があるため、コードとAPIを複雑にします。常に複数で問題はありません。
PositiveGuy

30
@TomaszPluskiewicz クライアントが気にしないのはあなたの言うとおりです。ソフトウェア開発者として、私たち気にする必要があります-そしてそのために、私は慣習についての建設的な議論が価値があるというWTFのコメントに同意します。
Travis D

12
誰かが1語だけ答えて受け入れてもらえるので、これをすべて(もう一度)読む必要はありません。
ベンジョージ

623

私にとっては、コードに直接マッピングできるスキーマ(自動化が容易)を用意するのが良いです。これは、主にコードが両端にあるためです。

GET  /orders          <---> orders 
POST /orders          <---> orders.push(data)
GET  /orders/1        <---> orders[1]
PUT  /orders/1        <---> orders[1] = data
GET  /orders/1/lines  <---> orders[1].lines
POST /orders/1/lines  <---> orders[1].lines.push(data) 

22
これの難しさは、HATEOSを尊重しないことによるものです。それが複数であるか単数であるか、他の何かであるかは問題ではありません。サーバーから送信されたURIを尊重し、クライアントでURIを「構築」しないでください。次に、コードに対して行うマッピングが0になります。
リチャード2015

7
@richardクライアントはまだマッピングを行う必要があります。HATEOSでは、URI構造との関係(rel)を表す名前にマップする必要があります。次に、rel、method(動詞)、およびContent-Typeがリソースメディアを構成します。これは、優れたURI設計の必要性を排除するものではありません。クライアントがrel名を優先する場合でも、APIの開発者は、URI構築のための人間が読める優れた標準が必要です。

4
これは私の意見ではより良い答えです。ただし、私は常に複数形ではなく単数形を使用することを好みました。User.getList()、User.getById、User.deleteなど
東モンク

3
私はシンプルさが好きです。マッピングには、ルートに関するドキュメントとテストを非常に簡単に作成できるという利点もあります。
2017年

5
これは私には理にかなっています。ただし、私たちはデータベースファーストのショップです。つまり、データベーススキーマからコードとAPIエンティティを生成します。そして、データベース標準は単一のテーブル名を推奨する傾向があるので、それを使用しますが、この回答と同じロジックの下にあります。
アンドレ・C.アンデルセン

274

これを行う意味もわかりませんし、URIの設計としても最適ではないと思います。RESTfulサービスのユーザーとして、リストにアクセスするかリスト内の特定のリソースにアクセスするかに関係なく、リストリソースには同じ名前が付けられることを期待します。リストリソースを使用する場合でも、特定のリソースを使用する場合でも、同じ識別子を使用する必要があります。


69
これは、私にとっては最良の答えです。APIデザイナは「get resource#123」という言葉の正確さを好むことを感謝しますが、APIのクライアントやヘルプドキュメントを作成するときに、余分なコーディングの手間がかかります。(GET / api / people vs. GET / api / person / 123?euuuchh。)....「get resource#123」のように考える代わりに、「get the collection of resources of get #123に一致します。
Warren Rumak 14年

5
複数/単数のリソースを区別することは、言語の正確さについてではなく、規模についてです。/ employees / 12は、IDが「12」の従業員リソースのサブセットとして私に読み取ります(たとえば、最近解雇された従業員に対する保存された検索クエリなど)。上記をID '12'の従業員として読んだ場合、サブセットをどのように表現しますか?唯一の選択肢は、オブジェクトを含むURIのより複雑な鉱石識別コレクションをオブジェクト自体から作成することです(つまり、単数形と複数形)。
エリック

9
最近解雇された従業員(または任意のサブセット)の検索クエリを表すために/ employees / 12を選択するのは悪いデザインだと思います。任意の種類のサブセットを表現したい場合は、それ自体をリソース(適切な名前のリソース)として紹介することをお勧めします。
Jan Deinhard、2015

3
これはクライアントの理解度とは関係ありません。それは、さまざまなURLでさまざまなことに対処することです。競合することなくすべてのHTTPメソッドに応答できること。アイテムのコレクションであるリソースと、アイテム自体を表すリソースを持つことができます。コレクションリソースがexample.org/166316e2-e1であり、そのコレクションの特定のアイテムがexample.org/20d68348-ccc-001c4200deである可能性があることに気をつけています。クライアントはURLを構築すべきではありません(これは明らかにスケーリングされず、RESTfulではなく、それがリンク関係タイプの目的です)。
エリック

4
任意のURLがきれいだと思わない場合は、複数の名前を持つコレクションリソースと単数の名前を持つ個々のアイテムを自由に識別してください。英語のURLが好きでなく、自然言語がそのような方法で単数/複数表記をサポートしていない場合は、他の何かを使用して好みの言語で定義します。すべての言語で「/ the-collection-of-」を区別できると思いますbla / 2321 'と' bla / 61 'の比較。また、GET / PUT / DELETE / POST / PATCHなどを送信すると、これら2つの異なるリソースはそれぞれまったく異なる結果を表します。
エリック

77

複数

  • シンプルな -すべてのURLは同じプレフィックスで始まります
  • 論理 -orders/注文のインデックスリストを取得します。
  • 標準 -最も広く採用されている標準の後に、圧倒的多数のパブリックおよびプライベートAPIが続きます。

例えば:

GET /resources -リソース項目のリストを返します

POST /resources -1つまたは複数のリソース項目を作成します

PUT /resources -1つまたは複数のリソース項目を更新します

PATCH /resources -1つまたは複数のリソースアイテムを部分的に更新します

DELETE /resources -すべてのリソースアイテムを削除します

単一のリソースアイテムの場合:

GET /resources/:id- :idパラメータに基づいて特定のリソース項目を返します

POST /resources/:id -指定されたIDで1つのリソース項目を作成します(検証が必要です)

PUT /resources/:id -特定のリソース項目を更新します

PATCH /resources/:id -特定のリソース項目を部分的に更新します

DELETE /resources/:id -特定のリソース項目を削除します

単数の擁護者にとっては、次のように考えてください。誰かにを頼んで、order1つのことを期待しますか、それともリストを期待しますか?では、入力したときにサービスが物事のリストを返すことを期待するのはなぜでしょう/orderか。


10
単数形:システムの一部が1つのオブジェクトのみ(0-1が存在するかどうか)の場合(例:users / 1 / avatar)、この単一のオブジェクト(アバターなど)にラベルを付けるために単数形を使用できます-詳細はこちらの例:stackoverflow .com / a / 38296217/860099。ところで-非常にいい答え:)
カミル・キエチェフスキー

単数形でなければならないクラス名とテーブル名へのマッピングはどうですか?(他の回答を参照)
ウィルシェパード、

@WillSheppard-クラス名は単数形が最適で、テーブル名は複数形が最適です。たとえばOrder、1つの注文を参照するオブジェクトの単一のインスタンスを処理するクラスに適した名前です。OrderList複数のOrderインスタンスを扱うクラスの名前です。Orders Table多くの注文のデータベーステーブルに適した名前です。
Eric Knudtson、2018

/ ordersを
取得し

@ jim-smithでは、GET / users / 1を使用してユーザーのコレクションから/ 1をリクエストしてみませんか?
ローマー

49

特異な

便利な ものは不規則な複数の名前を持つことができます。時々彼らは持っていない。しかし、単数形の名前は常にそこにあります。

例:CustomerAddressesに対するCustomerAddress

この関連リソースを検討してください。

これ/order/12/orderdetail/12はより読みやすく論理的です/orders/12/orderdetails/4

データベーステーブル

リソースは、データベーステーブルのようなエンティティを表します。論理的な単数の名前が必要です。これが答えですがテーブル名です。

クラスマッピング

クラスは常に単数です。ORMツールは、クラス名と同じ名前のテーブルを生成します。使用されるツールが増えるにつれて、単数形の名前が標準になりつつあります。

REST API開発者のジレンマについてもっと読む


39
単数形の名前は常に存在します /clothe/12/trouser/34 :)
Gert Arnold

18
@GertArnold単語clotheは動詞です。Rest APIは通常、リソースについて話すときは名詞に固執し、アクションを説明するときは動詞を使用します。単数形はですがclout、古風であり、より適切にに置き換えられgarmentます。
Steve Buzonas

@SteveBuzonasそして、ズボンとサングラスは?
Koray Tugay

32

最も一般的な方法は複数形が使用されるRESTful APIですが/api/resources/123、たとえば、複数形の名前よりも単数形の名前の方が適切/表現力が高いと感じる特別なケースが1つあります。1対1の関係の場合です。具体的には、ターゲットアイテムが値オブジェクトである場合(ドメイン主導の設計パラダイム)。

すべてのリソースが1対1でaccessLogあり、値オブジェクトとしてモデル化できると想定します。つまり、エンティティではないため、IDはありません。それはとして表現することができます/api/resources/123/accessLog。通常の動詞(POST、PUT、DELETE、GET)は、意図が適切に表現され、関係が実際に1対1であるという事実も適切に表現します。


4
よい試み。しかし、 "accessLogEntries"のほうが良いでしょう。:-)
トムラッセル

8
@TomRussellなんで?これの影響は重要です。識別子でリソースにアクセスしている場合でも複数を使用する理由を理解していますが、多対1または1対1の場合、それはかなり誤解を招きます。複数の場所にある会社のスタッフメンバーを管理するAPIについて考えます。各スタッフは1つの場所で作業します。GET /users/123/locationユーザーが作業している場所を取得する必要があります。GET /users/123/locations消費者として本当に誤解を招くのではないですか?
Carrie Kendall 2017年

1
@CarrieKendall私はあなたのポイントを理解しています。accessLogはエンティティではなく属性または値としてモデル化されているため、単数形である必要があります。あなたがオーバーエンジニアリングに与えられている場合、ログエントリは、エンティティとなり、あなたが持っていると思います/api/accessLogEntries?resource=123
トムラッセル

同意しますが、すべてのものを複数形にするという慣習を破ると思います。トリッキーです。私にとって、APIが単純であることは重要です。つまり、ドキュメントはすでに単純な実装を補完するものでなければなりません。
Carrie Kendall 2017年

私はシステムやデータベースの人というよりはプログラマーなので、慣習に固執するのではなく、ストーリーを伝えるAPIが好きです。ただし、自動化されたドキュメントへの影響は現実のものです。
トムラッセル

26

単数形が一般に受け入れられている、データベーステーブル名の一般的な傾向に従ってみませんか?そこに行って、それをやりました。再利用しましょう。

テーブル命名のジレンマ:単数名と複数名


8
ダスオートはダイオートよりもはるかに優れています。また、英語の複数の慣習は一貫していません。
FlavorScape 14年

7
リソースの名前空間は、実装ではなくセマンティクスの問題です。したがって、DBテーブルの例えを使用することは、あまり幸運ではありません。また、DBを操作する場合は、テーブルのみを操作しますが、もちろんコンテンツ(行)に影響を与える可能性がありますが、RESTでは、単一のリソースを直接操作するための制約はありません。
arpadf 2014年

3
これは良いアナロジーだと思いますが、単数にするか複数にするかを決めるよりも、どちらを選ぶかに一貫性を持たせることが重要です。ユーザーに挿入して、ユーザーから選択することはありません。同じルールがRESTリソースに適用されるはずです-何をしているのかに応じて名前を変更しないでください。
トッド・メニア2015

3
そのテーブル名だけでなく、OOのクラス名にも相当します(私のクラスはCustomersではなくCustomerと呼ばれます)。
bytedev 2017

この場合、セマンティックは、「定義済み」の傾向を単純に受け入れるにはあまりにも重要です
Cattani Simone

19

こんなに多くの人が複数形の名詞バンドワゴンに飛び乗るのを見て驚いた。単数形から複数形への変換を実装する場合、不規則な複数名詞を扱いますか?あなたは痛みを楽しんでいますか?

http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htmを参照して ください

不規則な複数形には多くの種類がありますが、これらは最も一般的です。

名詞型複数形の例

Ends with -fe   Change f to v then Add -s   
    knife   knives 
    life   lives 
    wife   wives
Ends with -f    Change f to v then Add -es  
    half   halves 
    wolf   wolves
    loaf   loaves
Ends with -o    Add -es 
    potato   potatoes
    tomato   tomatoes
    volcano   volcanoes
Ends with -us   Change -us to -i    
    cactus   cacti
    nucleus   nuclei
    focus   foci
Ends with -is   Change -is to -es   
    analysis   analyses
    crisis   crises
    thesis   theses
Ends with -on   Change -on to -a    
    phenomenon   phenomena
    criterion   criteria
ALL KINDS   Change the vowel or Change the word or Add a different ending   
     man   men
     foot   feet
     child   children
     person   people
     tooth   teeth
     mouse   mice
 Unchanging Singular and plural are the same    
     sheep deer fish (sometimes)

5
私はここでの懸念を理解していません。プログラムで単数形から複数形に変更することは想定されていません。上記の複数形のほとんどはよく知られており、心配する必要はありません。英語の知識が乏しい人は、変数の一部を間違ってつづるでしょう。また、ロジックに沿って、ソースコードのコレクションを参照するために単数形を使用することもお勧めしますか?
kishorホウ酸塩

1
Anglosphere内でも問題になることが多いほど不規則な英語の単語があり、それらはインデックス/インデックス/インデックス、頂点/頂点/頂点、マトリックス/行列/マトリックス、半径/半径/などの一般的に使用される用語ですとにかく、RESTパスを複数にすることには意味がありません。なぜなら、それらすべてが一貫して単数である場合、それは誰にとってもより明白だからです。
DAMD

@ kishorborate、URIを複数として使用すると、ネイティブの英語話者であってもエラーが発生しやすくなります。damdが示すように、インデックス/インデックス/インデックスのような複数形は、より多くの問題を引き起こしています。そして、数え切れないほどの名詞があります。数えられない名詞を複数と混合することも別の問題です。なぜプログラマーがこれらにもっと時間を費やすのを難しくするのですか?すべてに単数形を使用することをお勧めします。/ {id}がある場合、APIは単一のレコードを返す必要があります。続く/ {id}がない場合、APIはコレクションを返す必要があります。
Daming Fu

3
@DamingFu単一リソースには、常にIDが関連付けられているとは限りません。例えば。/ user / {id} / nickNameこれを見ると、ニックネームのリストが返されるのか、それとも単一のニックネームが返されるのかわかりません。したがって、複数のフォームを使用すると、APIはより直感的になります。はい、いくつかの単語は不規則な複数形になります。複数形を読んでいる人にとっては問題ではありません。これは、API署名を書き込むときにのみ問題になります。しかし、そのような単語の頻度は高くありません。また、任意の単語の複数形を見つけることは時間がかかりません。APIをより直感的にするために、私たちが受け入れるべきトレードオフです。
キショールホウ酸塩

15

APIコンシューマーの観点から、エンドポイントは予測可能である必要があります

理想的には...

  1. GET /resources リソースのリストを返す必要があります。
  2. GET /resource 400レベルのステータスコードを返す必要があります。
  3. GET /resources/id/{resourceId} 1つのリソースを持つコレクションを返す必要があります。
  4. GET /resource/id/{resourceId} リソースオブジェクトを返す必要があります。
  5. POST /resources リソースをバッチ作成する必要があります。
  6. POST /resource リソースを作成する必要があります。
  7. PUT /resource リソースオブジェクトを更新する必要があります。
  8. PATCH /resource 変更された属性のみを投稿して、リソースを更新する必要があります。
  9. PATCH /resources 変更された属性のみをポストするリソースをバッチ更新する必要があります。
  10. DELETE /resourcesすべてのリソースを削除する必要があります。冗談:400ステータスコード
  11. DELETE /resource/id/{resourceId}

このアプローチは最も柔軟で機能が豊富ですが、開発に最も時間がかかります。したがって、急いでいる場合は(ソフトウェア開発では常にそうです)、エンドポイントresourceまたは複数形に名前を付けますresources。すべての複数形が「s」で終わるわけではないため、プログラムで内省して評価するオプションを提供するため、私は単数形を好みます。

とはいえ、最も一般的に使用されているプラ​​クティス開発者が選択した理由は何であれ、複数形を使用することです。これが最終的に私が選択したルートです。githubそしてtwitter、やのような人気のあるAPIを見ると、これが彼らのしていることです。

決定するためのいくつかの基準は次のとおりです。

  1. 時間の制約は何ですか?
  2. 消費者にどのような操作を許可しますか?
  3. リクエストと結果のペイロードはどのように見えますか?
  4. コードでリフレクションを使用してURIを解析できるようにしたいですか?

だから、それはあなた次第です。一貫性のあることなら何でも。


1
開発者はすべてのリソースが本質的に一部のコレクションの一部であると想定しているため、複数形が選択されているようです。ただし、「承認された規則」はPOST /users、それが1人のユーザーを作成し、それをコレクションに追加する必要があることを示しているようです。同意しません。POST /usersユーザーのリストを作成する必要があります(それが1のリストである場合でも)POST /user。複数のリソースエンドポイントと単数のリソースエンドポイントの両方が共存できない理由はわかりません。彼らはさまざまな行動を説明しており、その機能を誰も驚かせるべきではありません。
クラッシュ

パスにリソースIDを指定するための規則はありませんか?もしそうなら、それは広く無視されているようです。たとえばPOST users/<id>、新しいユーザーを作成します。
トムラッセル

1
@TomRussellは通常、サーバーがIDを作成するため、POSTするIDはまだわかりません。
アレックス

3
@TomRussell、クライアントが新しいリソースを作成するときに(一種の)IDを決定する場合、PUT /users/<id>ではなくを使用する方が一般的ですPOSTPOST「これをコレクションに追加し、その一部としてIDを決定する」という解釈があります。PUT「このリソースをこのIDで更新(または追加)する」という解釈があります。この原則の詳しい説明については、restcookbook.com / HTTP%20Methods / put-vs-postをご覧ください。
Jochem Schulenklopper 2017

彼らはすべてのエンドポイントに複数形を使用しているため、Twitter APIとの比較が公平であるとは思いません。同じ要素に対して複数と単数を混在させることはありません。
アンドリューTフィネル

7

私の2セント:時間を複数から単数またはその逆に変更する方法を費やすメソッドは、CPUサイクルの無駄です。私は古い学校かもしれませんが、私の時代には物事は同じと呼ばれていました。人に関するメソッドを検索するにはどうすればよいですか?通常の表現は、望ましくない副作用なしに人と人の両方をカバーしません。

英語の複数形は非常に恣意的であり、コードを不必要に邪魔します。1つの命名規則に従ってください。コンピュータ言語は、自然言語を模倣することではなく、数学的な明快さについてであるはずでした。


2
これは、エンドポイントを「自動生成/マングル」しようとするコードに対処します(複数/特異性を想定してマップしようとする多くの見解のあるライブラリがあります)。ただし、これは、明示的に選択されたエンドポイント名に適用されます(複数形に関係なく)正しい単語を選択する以上のものです。
user2864740 2018年

6

単純さと一貫性の両方のために、単数形を使用することを好みます。

たとえば、次のURLを考えてみます。

/ customer / 1

私は顧客を顧客の集まりとして扱いますが、簡単にするために、集荷部分は削除されています。

もう一つの例:

/ equipment / 1

この場合、機器は正しい複数形ではありません。したがって、それを機器のコレクションとして扱い、簡単にするためにコレクションを削除すると、顧客のケースとの一貫性が保たれます。


2
POST / customerは、唯一の顧客に取って代わるようです。これは、単一のリソース名を使用することに対する私の最大の悲嘆です。
アンドリューTフィネル

2
@ andrew-t-finnellまさにそれPOST /customerを行うべきではありません-単一の顧客を挿入しますか?
donmutti

単一の顧客を顧客のコレクションに挿入します。お客様にPOST /customerPOSTしているように読みtheます。お客様のコレクションではありません。ただし、Pluralかそうでないかは好みです。他の回答のように混ざっていない限り。それは信じられないほど混乱するでしょう。
アンドリューTフィネル

この場合、「顧客にPOSTする」ことは意味がありません。POSTは置き換えられず、挿入されます。多分それがPOST / customer / 1だった場合、ジレンマを見ることができましたが、何を挿入しているので、それはRESTの観点からはあまり意味がありません。/ customer / 1 /
invoice

5

ルートのIDはリストのインデックスと同じように表示され、それに応じて命名が行われる必要があります。

numbers = [1, 2, 3]

numbers            GET /numbers
numbers[1]         GET /numbers/1
numbers.push(4)    POST /numbers
numbers[1] = 23    UPDATE /numbers/1

しかし、一部のリソースはルートにIDを使用しません。これは、1つしか存在しないか、ユーザーが2つ以上にアクセスできないため、リストではないためです。

GET /dashboard
DELETE /session
POST /login
GET /users/{:id}/profile
UPDATE /users/{:id}/profile

4

命名規則を使用すると、通常は「1つだけ選択してそれを守る」と言っても安全です。

ただし、RESTを多くの人に説明する必要があるため、エンドポイントをファイルシステム上のパスとして表すことが最も表現力のある方法です。
ステートレス(ファイルが存在するか存在しないかのどちらか)、階層的、シンプル、そして使い慣れたものです。ローカルでもhttpでも、静的ファイルにアクセスする方法はすでに知っています。

そして、その文脈の中で、言語規則は次の範囲でのみあなたを得ることができます:

ディレクトリには複数のファイルやサブディレクトリを含めることができるため、その名前複数形にするがあります。

そして私はそれが好きです。
一方、それはあなたのディレクトリですが、それが必要な場合は、「a-resource-or-multiple-resources」という名前を付けることができます。それは本当に重要なことではありません。

重要なのは、「123」という名前のファイルを「resourceS」という名前のディレクトリの下に置くと、 /resourceS/123)、にからアクセスできると期待できないことです/resource/123

必要以上にスマートにしようとしないでください。現在アクセスしているリソースの数に応じて複数から単数に変更することは、見た目が良い場合もありますが、効果がなく、意味がありません。 階層システム。

注:技術的には、「シンボリックリンク」を作成できるため、から/resources/123もアクセスできます/resource/123が、前者はまだ存在している必要があります。


3

見ていグーグルAPI設計ガイドを:リソース名に関する別をご覧ください。

要するに:

  • コレクションは複数形で名前が付けられます。
  • 個々のリソースには文字列が付けられます。
|--------------------------+---------------+-------------------+---------------+--------------|
| API Service Name         | Collection ID | Resource ID       | Collection ID | Resource ID  |
|--------------------------+---------------+-------------------+---------------+--------------|
| //mail.googleapis.com    | /users        | /name@example.com | /settings     | /customFrom  |
| //storage.googleapis.com | /buckets      | /bucket-id        | /objects      | /object-id   |
|--------------------------+---------------+-------------------+---------------+--------------|

あなたがこの主題について考えているなら、それは読む価値があります。


2

すべてのメソッドに複数を使用することは、少なくとも1つの側面でより実用的です。Postman(または同様のツール)を使用してリソースAPIを開発およびテストしている場合、GETからPUTにPOSTなどに切り替えるときにURIを編集する必要はありません。 。


1
Postmanはコレクションを提供しているので、これは私にとって議論ではありません。したがって、すべてのリソースを異なるコレクションアイテムとして保存し、個別にテストできます。コレクションからリソースを選択するだけで、毎回パラメーター/メソッドなどを編集する必要はありません。
ウィローネ

1

どちらの表現も役立ちます。私はかなり前から便宜上単数形を使用していましたが、活用は難しい場合があります。厳密に単一のREST APIを開発した私の経験では、エンドポイントを使用する開発者は、結果の形がどうなるかについて確信を持っていません。今では、応答の形を最もよく表す用語を使用することを好みます。

すべてのリソースが最上位レベルである場合は、特異な表現で回避できます。抑揚を回避することは大きな勝利です。

リレーションに対するクエリを表すために何らかのディープリンクを実行している場合、APIを作成する開発者は、より厳密な規則を持つことで支援できます。

私の慣習では、URIの各レベルの深さは親リソースとの相互作用を記述しており、完全なURIは何が取得されるかを暗黙的に記述している必要があります。

次のモデルがあるとします。

interface User {
    <string>id;
    <Friend[]>friends;
    <Manager>user;
}

interface Friend {
    <string>id;
    <User>user;
    ...<<friendship specific props>>
}

クライアントが特定のユーザーの特定の友達のマネージャーを取得できるリソースを提供する必要がある場合は、次のようになります。

GET /users/{id}/friends/{friendId}/manager

次に、いくつかの例を示します。

  • GET /users -グローバルユーザーコレクションのユーザーリソースを一覧表示する
  • POST /users -グローバルユーザーコレクションに新しいユーザーを作成する
  • GET /users/{id} -グローバルユーザーコレクションから特定のユーザーを取得する
  • GET /users/{id}/manager -特定のユーザーのマネージャーを取得する
  • GET /users/{id}/friends -ユーザーの友達のリストを取得する
  • GET /users/{id}/friends/{friendId} -ユーザーの特定の友達を取得する
  • LINK /users/{id}/friends -このユーザーに友達の関連付けを追加する
  • UNLINK /users/{id}/friends -このユーザーから友達の関連付けを削除します

各レベルが、アクションを実行できる親にどのようにマップされているかに注目してください。同じオブジェクトに異なる親を使用することは直観に反します。でリソースを取得してもGET /resource/123、新しいリソースの作成がPOST /resources


1

私はほとんどの人が複数を使用するか単数を使用するかを決定する間にいることを知っています。ここで対処されていない問題は、クライアントがどちらを使用しているかを知る必要があり、常に間違いを犯す可能性が高いことです。これが私の提案の出所です。

両方はどうですか?つまり、API全体に単数形を使用し、複数形で行われたリクエストを単数形に転送するルートを作成することを意味します。例えば:

GET  /resources     =     GET  /resource
GET  /resources/1   =     GET  /resource/1
POST /resources/1   =     POST /resource/1
...

あなたは写真を取得します。誰も間違っていない、最小限の努力、そしてクライアントは常にそれを正しく理解するでしょう。


1
302リダイレクトを実行していて、キャッシュがすべてを2度保存している場合は、キャッシュを正しく設定していません。キャッシュは302リダイレクトを格納することを想定していません。
wynnset 2018年

2
クライアントが常にを使用し/resources、常ににリダイレクトされる/resource場合、それは間違っています。他の誰かがあなたのAPIを使用している場合、彼らは正しいURLを直接使用するか、リダイレクトされます(これは機能しますが間違っています)。間違った方法で開いたのはあなたです。
maaartinus

あなたが「間違っている」という意味がわからない-それは非常に主観的です。それが機能するので、それは本当に間違っていません。
wynnset '17年

これにより、保守コスト、理解コスト、および必要なコードの量が増加します。
シェパード、

1

{id}URL の一部がサブリソースと重複することを、id理論的には何でも可能であり、あいまいさがある。異なる概念(識別子とサブリソース名)が混在しています。

同様の問題は、enum定数やフォルダー構造でよく見られます。ここでは、異なる概念が混在しています(たとえば、フォルダーTigersLionsおよびCheetahsがあり、さらにAnimalsと同じレベルでは- 1でのサブセットであるとして、これは意味がありませんその他)。

一般に、エンドポイントの最後に指定された部分は、一度に1つのエンティティを処理する場合は単数であり、エンティティのリストを処理する場合は複数である必要があると思います。

したがって、単一のユーザーを扱うエンドポイント:

GET  /user             -> Not allowed, 400
GET  /user/{id}        -> Returns user with given id
POST /user             -> Creates a new user
PUT  /user/{id}        -> Updates user with given id
DELETE /user/{id}      -> Deletes user with given id

次に、ユーザーに対してクエリを実行するための別のリソースがあり、通常はリストを返します。

GET /users             -> Lists all users, optionally filtered by way of parameters
GET /users/new?since=x -> Gets all users that are new since a specific time
GET /users/top?max=x   -> Gets top X active users

そして、特定のユーザーを扱うサブリソースのいくつかの例:

GET /user/{id}/friends -> Returns a list of friends of given user

友達を作る(多対多リンク):

PUT /user/{id}/friend/{id}     -> Befriends two users
DELETE /user/{id}/friend/{id}  -> Unfriends two users
GET /user/{id}/friend/{id}     -> Gets status of friendship between two users

あいまいさはなく、リソースの複数形または単数形の名前は、ユーザーが期待できるもの(リストまたはオブジェクト)のヒントになります。idsには制限がなく、理論的にnewは(将来の)サブリソース名と重複することなく、IDを持つユーザーを作成できます。


1

Singularを使用して、「ビジネスディレクトリ」などで見られる英語の慣習を活用してください。

「ブックケース」、「ドッグパック」、「アートギャラリー」、「映画祭」、「車のロット」など、多くのものがこのように読みます。

これは、URLパスを左から右に一致させるのに便利です。左のアイテムタイプ。右のタイプを設定します。

GET /users本当に今までのユーザーのセットをフェッチ?通常はありません。キーとユーザー名を含む一連のスタブをフェッチします。だから/usersとにかく、そうではありません。これは、ユーザーのインデックス、または「ユーザーインデックス」です。それをそれと呼ばないのはなぜですか?それは/user/indexです。私たちは、セットタイプを命名しましたので、私たちは、クエリパラメータなどに頼ることなく、ユーザーのさまざまな投影を示す複数のタイプを持つことができますuser/phone-list/user/mailing-list

そして、ユーザー300はどうですか?それはまだ/user/300です。

GET /user/index
GET /user/{id}

POST /user
PUT /user/{id}

DELETE /user/{id}

最後に、HTTPは1つの要求に対して1つの応答しか持てません。パスは常に単一の何かを指します。


-1

私にとって、複数はコレクションを操作しますが、単数はコレクション内のアイテムを操作します

コレクションはメソッドGET / POST / DELETEを許可します

アイテムはメソッドGET / PUT / DELETEを許可します

例えば

/ studentsに対するPOST は、学校に新しい生徒を追加します。

/ studentsで DELETE を実行すると、学校のすべての生徒が削除されます。

/ student / 123で DELETEを実行すると、生徒123が学校から削除されます。

重要ではないように感じるかもしれませんが、一部のエンジニアはIDを忘れることがあります。ルートが常に複数でDELETEを実行した場合、誤ってデータを消去してしまう可能性があります。一方、単数形のIDがない場合は、404ルートが見つかりません。

APIが複数の学校を公開することになっている場合の例をさらに拡張するには、次のようなもの

/ school / abc / studentsで DELETE を実行すると、学校のすべての生徒が削除されますabc

正しい単語を選択すること自体が難しい場合もありますが、コレクションでは複数を維持するのが好きです。たとえばcart_itemscart/items正しいと感じます。cart削除とは対照的に、カート内のアイテムではなく、カートオブジェクト自体を削除します;)。


とにかく、これを/ cartと/ cart / item(s)に分割しないでください。次に、カート全体(たとえば、削除)または個別のアイテムをアドレス指定できますか?
ロブ・グラント

@RobertGrantそれは "/ carts / items / 123"ではないでしょうか?(たとえば、「カート」ではなく「カート」が規則である理由は「常に複数」ですか?)
user2864740

1
プロダクションコードがチェックインされていて、すべてのカートアイテムの削除を実行できる場合、命名規則よりも大きな問題があると私は主張します。彼らがIDの「s」を覚えている可能性が高いフードははるかに少ないです。
アンドリューTフィネル

コレクション全体を単に削除するエンドポイントを作成する人はいますか?私にとっては非常に危険に思われます。おそらくRESTがバッチ削除を実際にサポートしていないのはなぜでしょうか。(配列をオブジェクトにラップする必要があります)。コレクション全体を削除するためにエンドポイントが絶対に必要な場合は、URIが非常に一意で、POSTとは
明らかに異なります

-1

どうですか:

/resource/(ではない/resource

/resource/ 「リソース」と呼ばれるものが含まれているフォルダであることを意味します。これは「リソース」フォルダです。

また、データベーステーブルの命名規則も同じだと思います。たとえば、「user」というテーブルは「userテーブル」であり、「user」という名前のものが含まれています。


-2

私は複数形(/resources)と単数形(/resource/{id})のこれは、リソースのコレクションでの作業と単一のリソースでの作業の間のロジックをより明確に分離するためです。

これの重要な副作用として、誰かがAPIを誤って使用するのを防ぐこともできます。たとえば、ユーザーが次のようにパラメーターとしてIDを指定してリソースを誤って取得しようとした場合を考えてみます。

GET /resources?Id=123

この場合、複数形バージョンを使用すると、サーバーはIdパラメーターを無視し、すべてのリソースのリストを返します。ユーザーが慎重でない場合、ユーザーは呼び出しが成功したと考え、リストの最初のリソースを使用します。

一方、単数形を使用する場合:

GET /resource?Id=123

Idが正しい方法で指定されていないため、サーバーはエラーを返す可能性が高く、ユーザーは何かが間違っていることを認識しなければなりません。


1
なぜここでイディオムを混ぜているのですか?最初の段落で適切なURI表記を使用してから、クエリパラメータに切り替えますか?クエリパラメータを使用してIDが123のリソースを取得することは、ここでは完全に根拠がありません。
アンドリューTフィネル

それは明らかに間違いでした。回答を更新しました。お知らせいただきありがとうございます。
pberggreen 2018

再び反対票を投じられた後、私は自分が書いたものを見て、元の投稿が正しいことに気付きました。私の要点は、ユーザーが間違った操作を行った場合、複数形+単数形を使用すると、実際には複数形のみを使用するよりも優れたエラーメッセージが表示されるということでした。
pberggreen

私はまだこれが当面の問題を混乱させていると感じています。複数を使用するアイデアは、それがコレクションであるということです。そして最後の数字はコレクションへのインデックスです。/ resourceを単独で取得するとどうなりますか?複数形と単数形の両方を一緒に使用すると、かなり混乱します。/ resources / 123の発言:リソースバケットでリソース123を取得します。
Andrew T Finnell、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.