最良/一般的なRESTfulURL動詞とアクションは何ですか?


86

最良で最も一般的なRESTfulURLアクションに関する情報を見つけようとしています。

たとえば、アイテムの詳細を表示したり、アイテムを編集したり、更新したりするためにどのURLを使用しますか。

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

うーん。助けてくれた人に感謝します:)

回答:


173

アクションではなく、URLを使用してオブジェクトを指定します。

最初に述べたことはRESTfulではないことに注意してください。

/questions/show/<whatever>

代わりに、URLを使用してオブジェクトを指定する必要があります。

/questions/<question>

次に、そのリソースに対して以下の操作のいずれかを実行します。


取得する:

リソースの取得、リソースのリストのクエリ、およびリソースの読み取り専用情報のクエリに使用されます。

質問リソースを入手するには:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

すべての質問リソースを一覧表示するには:

GET /questions HTTP/1.1
Host: whateverblahblah.com

役職:

リソースの作成に使用されます。

以下はエラーであることに注意してください。

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

URLがまだ作成されていない場合は、名前を指定するときにPOSTを使用してURLを作成しないでください。これにより、まだ存在しないため、リソースが見つからないというエラーが発生するはずです。最初にサーバーにリソースを配置する必要があります。新しい質問を作成すると、質問のリストにもう1つの質問が返されるため、/ questionsリソースも更新していると主張できます。

POSTを使用してリソースを作成するには、次のようにする必要があります。

POST /questions HTTP/1.1
Host: whateverblahblah.com

この場合、リソース名が指定されていない場合、新しいオブジェクトのURLパスが返されることに注意してください。

削除:

リソースを削除するために使用されます。

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

プット:

リソースのURLを指定するときに、リソースを作成または上書きするために使用されます。

新しいリソースの場合:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

既存のリソースを上書きするには:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

...はい、同じです。PUTは、リソース全体をわずかに変更されたバージョンに置き換えることで、クライアントが次に取得するときに取得するものを編集したため、「編集」メソッドと呼ばれることがよくあります。


HTMLフォームでのRESTの使用:

HTML5仕様定義GETおよびPOSTのフォーム要素について

メソッドcontent属性は、次のキーワードと状態を持つ列挙属性です。

  • キーワードGETは、状態GETにマッピングされ、HTTPGETメソッドを示します。
  • キーワードPOST、状態POSTにマッピング、HTTPPOSTメソッドを示します。

技術的には、HTTP仕様はこれらのメソッドのみに制限されていません。技術的には自由にメソッドを追加できますが、実際にはこれはお勧めできません。GETを使用してデータを読み取ることは誰もが知っているため、代わりにREADを使用することにした場合は問題が混乱します。そうは言っても...

パッチ:

これは、正式なRFCで定義されたメソッドです。これは、リソースに部分的な変更のみを送信する場合に使用するように設計されており、PUTのように使用されます。

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

違いは、PUTは実際に変更されたものと比較してどれほど大きくても、リソース全体を送信する必要があるのに対し、PATCHは変更のみを送信できることです。


こんにちはブライアン..私がこれを読めば読むほど、それは意味を成します。一部のブラウザ(またはブラウザバージョン)がPUTまたはDELETEをサポートしていないと思いますか?その場合、代わりにPOSTを使用しますか?
Pure.Krome 2008年

1
こんにちはPure.Knome; Webブラウザはそれらすべてをサポートします。また、HTTPライブラリもそれらすべてをサポートする必要があります。
ブライアンR.ボンディ


1
@ブライアン:PUTの例についてさらにいくつか質問があります。>> PUT / question / <new_question>フォーム内のすべてのデータが新しいリソースの作成に使用されるため、>> PUT / question /を実行する代わりに、なぜそれを実行するのですか?(次のコメントに続く)...
Pure.Krome 2008年

1
@ブライアンR.ボンディ、素晴らしい答えをありがとう。既存のリソースへのPOSTリクエストは、一般的な「変更」という用語とは異なり、oreillyの安らかな本(pg:100,101)では「追加」として説明されています。結局のところ、追加することは変更することよりも具体的であり、「既存のリソースにPUT」を伝える可能性があり、意味的にはPOSTに対してより正確に聞こえます。指定されたリンクに新しいリソースを追加するか、そのリンクに子リソースを作成します。 。
Özgür

11

/questions/10有効な質問であると仮定すると、メソッドはそれと対話するために使用されます。

それに追加するPOST

それを作成または置換するためにPUT

GETして表示/クエリする

そして、よく削除します。

URLは変更されません。


4
違う。PUTはべき等でなければなりません。同じPUTリクエストを何度も実行できる必要がありますが、初回以降は効果がありません。したがって、すべてのPUT要求でリソースを作成することはべき等ではありません。
aehlke 2009

3
「メソッドPUTとDELETEはべき等であると定義されています。つまり、複数の同一のリクエストが1つのリクエストと同じ効果を持つはずです。」現在リソースを利用できないURIでputを使用すると、リソースを作成できます。すぐにもう一度PUTを実行すると、もう一度実行するだけで効果はありません。このようにしてリソースを作成していますが、クエリはべき等です。後で戻ってリソースを変更したい場合は、異なるデータを使用して同じURIにPUTを実行します(これは異なる要求であり、それ自体が何度でも繰り返されて同じ結果になる可能性があります)。
Allain Lalonde

1
実際、上記の25票を獲得した回答を見てください。これは、PUTを使用してリソースを作成または置換できると述べています。
Allain Lalonde

3
作成は、新しいリソースのIDの指定が許可されている場合にのみ機能します。可能ではあるが、それはより頻繁に/コレクションPOSTへのユーザーのために、よりconvinentで、新しいIDが含まれるリンクが返される:
pgraham

2
@aehIke PUTによる新しいリソースの作成は、私が 'PUT / items / 10'であり、アイテム10が以前に存在しなかった場合、それが作成されるだけであるという考えであるため、べき等ではありません。ただし、2回目に「PUT / items / 10」を実行すると、すでに存在しているため、置き換えられるだけなので、後続のPUT要求には新しい副作用がないため、べき等性が保持されます。(もちろん、それは私が毎回まったく同じアイテムを置き続けることを前提としています)
Alappin 2015

3

あなたの例は「RESTful」ではないと見なされる可能性があるため、私は手足に出て、「RESTful」URLと言うときのMVCの標準コントローラーは何であるかを推測します(この記事を参照)。

Railsはあなたが興味を持っていると思われるURLスタイルを本当に普及させたので、Ruby onRailsのScaffoldingGeneratorによって生成されるデフォルトのコントローラーアクションを以下に示します。これらは、Railsアプリケーションを使用している人なら誰でも知っているはずです。

足場となるアクションとビューは、インデックス、リスト、表示、新規、作成、編集、更新、破棄です。

通常、これは次のように作成します。

http://application.com/controller/<action>/<id>

5
帯域外URI規則はRESTfulではありません。フィールディング自身の引用:「RESTAPIは、固定のリソース名や階層(クライアントとサーバーの明らかな結合)を定義してはなりません。サーバーは、独自の名前を自由に制御できる必要があります。代わりに、サーバーがクライアントに適切なURIの構築方法を指示できるようにする必要があります。 、メディアタイプおよびリンク関係内でこれらの命令を定義することにより、HTMLフォームおよびURIテンプレートで行われるような。 "
aehlke 2009

1

これは、RESTの原則を使用した現在のURLのマッピングです。

/question/show/<whatever>

質問をリソースとして識別する場合は、一意のURLが必要です。GETを使用して表示(取得)するのが一般的な方法です。あれは。。。になる:

GET /question/<whatever>

/question/edit/<whatever>

ここで、ユーザーが同じリソースの別のビューを表示して、リソースを編集できるようにします(おそらくフォームコントロールを使用)。

ここでの2つのオプションは、アプリケーションがアプリケーション(Webサイトではない)である場合、JavaScriptを使用して、リソースをクライアント側で編集可能なリソースに変換する方がよい場合があります。

これがWebサイトの場合、同じURLを追加情報とともに使用して、別のビューを指定できます。一般的な方法は次のようです。

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

これは質問を変更するためのものであるため、PUTが正しい使用方法です。

PUT /question/<whatever>

/question/list   (lists the questions)

質問のリストは実際には質問の親リソースであるため、当然次のようになります。

GET /question

今、あなたはもう少し必要かもしれません:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

多田:)


-1

4つの例は次のとおりです。

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

質問を追加するには:

POST /questions q=What+is+the+meaning+of+life

サーバーは次のように応答します。

200 OK (or 201 Created)
Location: /questions/456
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.