1

いくつかの理由で、私のアプリケーションには次のようなフローの API が必要です。

  1. クライアントがサーバーを呼び出して、新しいリソースの ID を取得します。
  2. 次に、ユーザーはリソースのフォームに入力するのにしばらく時間を費やします。
  3. 次に、ユーザーが [保存] をクリックします (または保存しない...)。クリックすると、クライアントは書き込みによって保存します。/myresource/{id}

これを設計するRESTfulな方法は何ですか?

最初の呼び出しはどのように表示されますか? サーバー側では、ID を生成して返すだけです。これには副作用があります (シーケンスを増やして「スペースを確保」します) が、リソースを明示的に作成しません。

私が正しく理解していれば、既知の URI で何かを作成するため、3 番目の呼び出しは PUT である必要があります。

4

4 に答える 4

1

あなたがそれを行うことができる1つの方法は次のとおりです。

  • クライアントPOSTの空のボディ/myresource/
  • サーバーは、応答ヘッダーが設定された状態コード302 (Found)で応答します (リソースの作成に使用する必要がある ID / URI を示すため)。Location/myresource/newresourceid
  • clientは、ユーザーがフォームへの入力を完了するとPUT、新しいリソースを返します。/myresource/newresourceid

十分なRESTfulのようです。;)

于 2013-08-01T07:04:46.643 に答える
0

これを行う方法はたくさんあると思うので、この質問に対する他の回答を見ることに興味があります。

可能であれば、データベース内の自動インクリメント ID を代理キーとして使用し、別のフィールドをビジネス IDとして割り当てます。製品コードやGUIDのようなものである可能性があります。

これを念頭に置いて、クライアントはIDを自分で作成できるようになり、ステップ 1 の必要がまったくなくなりました。/myresource/MLN5001などの URL に PUT を実行し/myresource/3F2504E0-4F89-11D3-9A0C-0305E82C3301て、リソースを作成します。ID が既に使用されている場合は、応答本文の競合で409 Conflictを返します。それ以外の場合は、 201 Createdを返し、リソースへの URI を応答本文と場所ヘッダーに含めます。

于 2013-08-01T06:21:40.470 に答える
0

ID 割り当ては冪等ではありません — 割り当て操作の 2 つの呼び出しは異なるID を取得します — そのため、常に POST である必要があります。その時点から、リソースは概念的に存在する必要があります。ただし、その時点で私が行うことは、合理的なデフォルト値を入力することです (POST を実行するか PUT を実行するかは、設計全体の RESTfulness にとって重要ではありません)。これにより、ユーザーは時間をかけて変更を加えることができます。彼らが望むように見えたいということ。

問題は、ある種の「これをリリースする」必要があるかどうかの 1 つになります。最後に、「変更して完了です」操作を行います。厳密な RESTfulness は、リソース識別子 (URL) を知っているかのように、あってはならないと言います。それについて話すことができます。一方、これは、作成ユーザーがリソースに満足するまで、ホスティング サーバーがリソースについて他の誰かに知らせる必要があるという意味ではありません。一般的な HATEOAS の原則では、他の人がいつリソースが存在することを発見できるか、または名前を知っていれば内容を読み取れるかどうかについては何も述べていませんが、リソースの所有者が「make this」をオンにするまで、リソースの存在を第三者に否定することは完全に合理的です。 public」フラグ。

于 2013-08-01T12:56:31.430 に答える
0

私は一緒に行きます

GET /myresource/new-id
POST /myresource/{id}

あなたのウォークスルーは動詞でかなり明確です:

  1. 「新しいリソースの ID を取得する」

new-id の名前を最も明確にすると思われる名前に変更できます。これを行う必要があるリソースが複数ある場合は、ジェネレーターを次のような独自のリソースに分割することをお勧めします。

GET /id-generator/myresource
GET /id-generator/my-other-resource

複数のケースがある場合、ユーザーは ID を取得するために id-generator を押す必要があることをすぐに理解します。1回だけだと、たまにしか使わないのが面倒くさい。

あなたもできると思います

GET /myresource-id-generator/next

これは少し明確に見えますが、別の ID を生成する必要がある場合は、そのために別のリソースを作成する必要があります。

于 2013-08-01T12:25:38.253 に答える