こんにちは、この注文を注文システムに送信する必要がある注文があります。実行できるいくつかの操作があります。
リソースをモデル化した方法は次のとおりです。
1. PUT /orders/{id} - CREATE operation
2. PUT /orders/{id} - if exists MODIFY
3. POST /orders - no ID is specified so simulate is executed instead .
4. POST /orders/{id} - id is specified it performs modification check without persisting it.
5. DELETE /orders/{id}
6. GET /orders/{id}
私の質問は3番と4番です。
リソースに対するアクションをどのようにモデル化しますか。私のマッピングは良いですか、私は次のようにURLを介してアクチュオンをマッピングする必要がありました:
/orders/id/validate
/orders/id/simulate
RESTの点でより正確なものは何ですか?
3と4を使用し、その後さらにアクションが来るとどうなりますか?オペレーションフィールドを作成してオペレーションを配置するものまたは、操作はURLで実行する必要がありますか?
/ orders/id/validateでPUTを使用しても、キーをまったく作成せず、検証するだけでよいですか?代わりに投稿する必要がありますか?
RESTは、選択したURIを実際には気にしません。通常は、提供する応答でこれらのURIをクライアントに提供するため、サーバー上でいつでも自由に変更できます。
URIをクライアントにハードコーディングすると、後でURIを変更するときに問題が発生する可能性がありますが、それでも、新しいURIを考え出して新しい機能をカバーすることができます。
つまり、メソッドのセマンティクス(GET、PUT、POST)が順守されている限り、そうしたURIは問題ありません。
その点、PUTは そのセマンティクス に従ってサーバー上にリソースを作成すると想定されているため、検証機能にはPOSTを使用する必要があります。
職場でも同様の状況があり、私たちの用語ではドライランと呼ばれるユーザーリクエストをシミュレートすることが目的でした。これは、システムが要求を満たすことができる十分なデータを持っているかどうかを確認することでした。プロセスが進んでいる間、私たちには多くのビジネス要件があったからです。
作成とシミュレーションに関しては、コメントは1つだけです。
作成でポストを作成として使用できるようにします:POST items/{requestObject}
リクエストオブジェクトでブールフィールドシミュレーション/ dryRunを定義し、リクエストを上記のエンドポイントに送信します
RESTの点でより正確なものは何ですか?
RESTは、リソースには niform interface が必要であることのみを述べています。 GET/PUT/POSTなどはHTTPから来ます。
「非永続的アクション」は、リクエストのセマンティクスを safe にしたいように聞こえます。コアHTTPは、メッセージ本文のセマンティクスも定義する safe セマンティクスを持つメソッドを定義しません。 HTTPのレビュー メソッドレジストリ は、SEARCHとREPORTを調べることをお勧めしますが、これらはWebDAVからのものであるため、定義されたセマンティクスは、私たちが望むほど一般的ではない場合があります。
フィールディング、2009年に執筆
POSTは、「このアクションは標準化する価値がない」という一般的な目的を含め、HTTPで多くの有用な目的を果たします。
以下はすべて、このVALIDATE/SIMULATEは標準化する価値がないという前提に基づいています。
リクエストでどのURIが使用されるかを気にする理由は、キャッシュと cache invalidation です。成功したPOST to /x
は、そのリソースのキャッシュされた表現を無効にします。これは、/x
の表現を変更するときに必要なことです。たとえば、コレクションに新しいアイテムを追加すると、コレクション自体の陳腐化した表現が無効になります。
この場合、POST for some safe を使用している場合、「キャッシュ無効化」ルールはnot私たちの好意で、意味のない何かが代わりに無効化されるように、別のターゲットuriを使用したい場合があります。
これに基づいて、非永続アクションに異なるURIを使用する方が、同じURIを使用するよりも「RESTful」であると主張できると思います。
RESTもHTTPも、使用するURIのスペルに関する有用な提案を提供していません;それらがRFC 3986で定義された生成規則と一致している限り、マシンは気にしません。
RESTアプリケーション(ワールドワイドウェブなど)では、人間はどちらも気にしません-どのリソースがGoogle検索を処理しているかを最後に調べたのはいつですか?またはスタックオーバーフロー回答提出?
しかし、変数名と同様に、気にする人間にとって物事を容易にするURIを設計しようとします。
/orders/id/we-use-this-resource-for-something-weird
RESTは非常に緩いため、人によって意味が異なります。私の選択は
POSTは新しいアイテムをコレクションに追加します。したがって、できるのは
POST /items
ない
POST /items/100
PUTは、アイテムを既存の場所に(上書き)書き込みます。
PUT /items/100
PUTでは、アイテムのすべてのフィールドが存在する必要があります。アイテムの一部のみが変更されている場合は、
PATCH /items/100
動作の変更がリクエストされた場合は、クエリパラメータを使用します。
POST /items?whatIf=true
(シミュレーション操作に対処するため)
操作が明らかにHTTP動詞の1つに収まらない場合は、POST a command objectとします。例:
POST /orders/100/additem
RESTのステートレス要件を順守するように注意してください。私はPOST注文をしてから、別の呼び出しでそれを検証しません。その間、それは検証されるのを待っている中間の状態にあります。それが発生した場合、私はセマンティクスを持っているでしょう。 POST/cartなどのように、それを表します。