web-dev-qa-db-ja.com

REST APIを介して非永続アクションを正しくモデル化する方法

こんにちは、この注文を注文システムに送信する必要がある注文があります。実行できるいくつかの操作があります。

  1. 作成する
  2. 修正
  3. Check-Modification(これは既存の注文で発生します)
  4. 作成せずに作成をシミュレートする
  5. 削除する
  6. 注文を受ける

リソースをモデル化した方法は次のとおりです。

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を使用しても、キーをまったく作成せず、検証するだけでよいですか?代わりに投稿する必要がありますか?

3

RESTは、選択したURIを実際には気にしません。通常は、提供する応答でこれらのURIをクライアントに提供するため、サーバー上でいつでも自由に変更できます。

URIをクライアントにハードコーディングすると、後でURIを変更するときに問題が発生する可能性がありますが、それでも、新しいURIを考え出して新しい機能をカバーすることができます。

つまり、メソッドのセマンティクス(GET、PUT、POST)が順守されている限り、そうしたURIは問題ありません。

その点、PUTは そのセマンティクス に従ってサーバー上にリソースを作成すると想定されているため、検証機能にはPOSTを使用する必要があります。

2

職場でも同様の状況があり、私たちの用語ではドライランと呼ばれるユーザーリクエストをシミュレートすることが目的でした。これは、システムが要求を満たすことができる十分なデータを持っているかどうかを確認することでした。プロセスが進んでいる間、私たちには多くのビジネス要件があったからです。

作成とシミュレーションに関しては、コメントは1つだけです。

  1. 作成でポストを作成として使用できるようにします:POST items/{requestObject}

  2. リクエストオブジェクトでブールフィールドシミュレーション/ dryRunを定義し、リクエストを上記のエンドポイントに送信します

2
Tugrul ASLAN

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
1
VoiceOfUnreason

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などのように、それを表します。

0
Martin K