2016-05-10 8 views
1

私ができるDELETE単一のリソースのように:RESTful API - リソースコレクションの一部を削除しますか?

// Removes group 12 from employee 46 
DELETE /employees/46/groups/12 

は、私はできDELETE全体のリソースコレクションのように:

// Removes all groups from employee 46 
DELETE /employees/46/groups 

私は、リソースのDELETE一部に適切なRESTfulな方法を探していますコレクション。

  1. DELETE /employees/46/groups { ids: [12, 15, 32] }
  2. DELETE /employees/46/groups?ids=12,15,32
  3. DELETE /employees/46/groups/xx(シングル、しかし、3回それを呼び出す)

万一のクエリ文字列パラメータ(?ids=12,15,32は)のみGETで使用することが..?

リクエストボディ({ ids: [12, 15, 32] })は、常にPOST,PUTおよびDELETEと一緒に使用する必要がありますか?

これらの3つはすべて動作しますが、どちらが標準的な方法ですか。DELETEリソースコレクションの一部のみです。

+0

標準はありません –

答えて

4

JSON APIは、アプローチ番号1(DELETE /employees/46/groups)を使用しています。 RFC 7231 § 4.3.5は基本的には、本文中に送信されているものにかかわらず、ターゲットリソース(/employees/46/groups)全体が削除されると言っているので、それは怪しいものだと思います。しかし、others disagree

私はDELETE /employees/46/groups?ids=12,15,32が、あなた自身のリソースとして削除したいグループのセットを考慮しているので、最も良いと思います。ハイパーメディアにリンクを張ることができます。後でGETをサポートすることができます(しかし、そうする必要はありません)。

いいえ、クエリ文字列で非GETリクエストを送信することは絶対にありません。クエリ文字列は、何らかの種類の "パラメータ"ではありません(それを扱うことはしばしば役に立ちます)が、リソースのURIの不可欠な部分です。実際には、DELETE /api.php?type=employee&id=46&groups=12,15,32を使用できますが、それでも完全にRESTfulです。 RESTの全体的なポイントは、URI(他のものの中でも)がクライアントに対して不透明であるべきことです。

ただし、クエリ文字列のアプローチでは、1つの要求で実際に多数のグループを削除する場合に問題が発生する可能性があります。その場合、最も簡単な方法はPOST /bulk-delete-groups RPC呼び出しです。 PATCH /employees/46/groupsも考えてください(ただし、最初にRFC 5789 errataとお読みください)。

+0

私は大抵同意しますが、 'PATCH'はリソースの削除にはあまり適していません。セマンティクスを正しく適用すると、*不注意なものではなく*空の*リソース(またはそのプレゼンテーション) 。 – DaSourcerer

+0

@DaSourcerer '/ employees/46/groups'は* all *グループ(従業員46がメンバーです)のセットです。我々はそれらのいくつかを削除したいだけです*。そのため、削除するグループを記述した文書でそのセットを修正します。唯一の問題は、その文書の形式を慎重に選択し、正しい 'Content-Type'をそれに割り当てる必要があることです。 [JSON Patch](http://tools.ietf.org/html/rfc6902)はここでうまくいくかもしれません。 –

+0

@DaSourcerer私は完全に同意しない。 F.e. [JSON Patch](http://jsonpatch.com/)には、オブジェクトやリストから値を削除するための 'remove'操作があります。 1つのドキュメントでは、そのドキュメントの1つのエントリ(操作あたり)にしか影響しませんが、少なくとも1つのレベルをズームアウトして、含まれているリソースのデファクトディレクトリリソースにある場合、大きな障害なくサブリソースを削除できるはずです。しかし、すべての操作がトランザクション内で実行される必要があります(すべて成功するものもあれば成功しないもの) –

0

ほとんどのAPIは、一度にリソースのコレクションを削除することはできませんが、それは次のように実体上の他の操作を実行することが可能です:

DELETE /employees?id=12,15,32 

または

DELETE /employees?id=12&id=15&id=32 

良い選択かもしれません削除のためにマークされたIDを含むカスタムJSONオブジェクトを送信します。

関連する問題