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




スパイナルケース (12)

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

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

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


特異な

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

CustomerAddressesに対するCustomerAddress

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

この/order/12/orderdetail/12/orders/12/orderdetails/4よりも読みやすく論理的です。

データベーステーブル

リソースとは、データベーステーブルのようなエンティティを表します。 これは、論理的な特異な名前を持つ必要があります。 テーブル名answerを以下に示します。

クラスマッピング

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

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


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

理想的には...

  1. GET /resourcesGET /resourcesのリストを返すべきです。
  2. GET /resourceは400レベルのステータスコードを返さなければなりません。
  3. GET /resources/id/{resourceId}は1つのリソースを持つコレクションを返すべきです。
  4. GET /resource/id/{resourceId}はリソースオブジェクトを返すべきです。
  5. POST /resourcesはバッチによってリソースを作成する必要があります。
  6. POST /resourcePOST /resourceを作成する必要があります。
  7. PUT /resourceはリソースオブジェクトを更新する必要があります。
  8. PATCH /resourceは、変更された属性のみを転記してPATCH /resourceを更新する必要があります。
  9. PATCH /resourcesは、変更された属性のみを掲示しているPATCH /resourcesをバッチ更新するべきです。
  10. DELETE /resourcesはすべてのDELETE /resourcesを削除する必要があります。 ちょうど冗談:400ステータスコード
  11. DELETE /resource/id/{resourceId}

このアプローチは最も柔軟で機能豊富ですが、開発に最も時間がかかります。 急いでいる場合(ソフトウェア開発の場合は常にそうです)、エンドポイントresourceまたは複数のフォームresources名前を付けるだけresources 。 すべての複数形が 's'で終わるわけではないので、プログラムによるイントロスペクションと評価のオプションを与えるため、単数形を好む。

すべてのことを言っているが、どのような理由であれ、最も一般的に使用されている練習の開発者が選択したのは複数形を使うことである。 これは最終的に私が選んだルートで、 githubtwitterような人気のあるapisを見れば、これは彼らが行うことです。

決定の基準には次のものがあります。

  1. 私の時間制約は何ですか?
  2. 消費者にはどのような操作をさせることができますか?
  3. 要求と結果のペイロードはどのように見えるのですか?
  4. リフレクションを使用して、自分のコードでURIを解析できるようにしたいですか?

それはあなた次第です。 あなたが何をしていても一貫しています。


/resourcesを使用することの前提は、 "すべての"リソースを表すことです。 あなたがGET /resourcesをやるならば、コレクション全体を返すでしょう。 /resourcesにPOSTすると、コレクションに追加されます。

ただし、個々のリソースは/ resourceにあります。 GET /resourceを実行すると、このリクエストは意味をなさないので、おそらくエラーになりますが、 /resource/123は完璧な意味を持ちます。

/resource代わりに/resourcesを使用するのは、たとえばファイルシステムとファイルの集合で作業していた場合のやり方と似ています。また、 /resourceは個々の456ファイルの「ディレクトリ」です。

どちらの方法も間違いなく、あなたが一番好きなものと一緒に行ってください。


複数

  • 単純 - すべてのURLが同じ接頭辞で始まります
  • 論理的 - orders/の索引リストをorders/取得する。
  • 標準 - パブリックAPIとプライベート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 - 特定のリソース項目を削除する

単数の主張者には、このように考える:あなたは誰かにorderを尋ねて、一つのこと、または物事のリストを期待するだろうか? だから、あなたが入力/orderときにサービスがリストを返すとはどういうことでしょうか?


どのように:

/resource/ (not /resource

/resource/は、 "resource"という名前のフォルダを含んでいることを意味し、 "resouce"フォルダです。

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



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

http://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm参照してhttp://web2.uvcs.uvic.ca/elc/studyzone/330/grammar/irrplu.htm

不規則な複数のタイプがありますが、最も一般的です:

名詞型複数の例を作る

-fで終わります。fをvに変更します。-sナイフで生命の妻を妻にします。-fで終わります。-fでvを変更します。-esで半分にします。オオカミオオカミのローフスで終わります。と-usに変更-usi-cactus cacti核核フォーカスフォーカスは-isで終わる-is解析では危機の危機を分析する論文の終わりで論文の終わりに終わり-a現象への変化現象の基準すべての種類母音を変更するまたは単語を変更するか、別の終わりの男性を追加足の足の子どもの人の人の人々歯の歯マウスのマウスUnchanging単数と複数の同じ羊の鹿の魚(時々)


最も一般的なプラクティスはRESTful apisで、複数のものは/api/resources/123などが使われていますが、複数の名前よりも適切な/表現的な単数名の使用がある特別なケースが1つあります。 1対1の関係の場合です。 具体的には、ターゲットアイテムが値オブジェクト(ドメイン駆動設計パラダイム)である場合

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


私には複数のコレクションがコレクションを操作するのに対して、特異なコレクションコレクション内のアイテムを操作します

コレクションでGET / POST / DELETEメソッドを使用できます

ItemはメソッドのGET / PUT / DELETEを許可します。

例えば

POST on / studentsは学校に新しい学生を追加します。

DELETE on / studentsは学校のすべての生徒を削除します。

DELETE on / student / 123は学生123を学校から削除します。

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

APIが複数の学校を公開することになっていた場合の例をさらに拡大するには、

/学校/ abc /学生の DELETEは、学校のすべての生徒を削除します。

時には適切な言葉を選ぶこと自体は難題ですが、私はそのコレクションに複数のものを残したいと思います。 たとえばcart_itemscart/itemsは正しく感じます。 cartを削除するのとは対照的に、カート内のアイテムではなく自己のカートオブジェクトを削除します。


私の2つのセント:時間を複数から単数または逆に変える方法は、CPUサイクルの無駄です。 私は昔の学校かもしれませんが、私の時代には物事は同じように呼ばれました。 人に関する方法をどのように見上げるのですか? 通常の表現は、望ましくない副作用を伴わずに人と人の両方を対象としません。

英語の複数形は非常に恣意的であり、コードを不必要に煩わせる。 1つの命名規則に従う。 コンピュータ言語は、自然言語を模倣するのではなく、数学的な明快さであると考えられていました。


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

どうですか? そしてそれによって、あなたのAPI全体に単数形を使用し、複数形で行われた要求を単数形に転送するルートを作成することを意味します。 例えば:

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

あなたは写真を手に入れます。 誰も間違っていて、労力を最小限に抑え、クライアントは常にそれを正しく得ます。


私はシンプルさと一貫性の両方のために単数形を使用する方が好きです。

たとえば、次のURLを考えてみましょう。

/顧客/ 1

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

もう一つの例:

/機器/ 1

この場合、機器は正しい複数形ではありません。 だから、それを機器コレクションとして扱い、コレクションを単純化するためにコレクションを取り除くことは、それを顧客事例と一致させます。





uri