複数のアイテムを削除するRESTfulな方法は何ですか?
私のユースケースは、複数のアイテムを一度に削除できるようにする必要があるバックボーンコレクションがあることです。オプションは次のようです:
すべてのオプションは理想的ではありません。
これは、REST規則の灰色の領域のようです。
/records/1;2;3
の(単一の)リソースを削除する」という意味として解釈されます。これに対する2xx応答により、/records/1;2;3
のキャッシュが消去される場合があります。 notpurge /records/1
、/records/2
、または/records/3
; /records/1;2;3
、またはあなたの観点から意味をなさない他の事柄に対する410応答をプロキシします。records=[1,2,3]
から/delete-requests
などの本文をPOSTすることによって)作成されたリソース(応答のLocation
ヘッダーで指定)をポーリングして、要求が受け入れられたか、拒否されたか、進行中か、完了したかを確認します。これは、長時間実行される操作に役立ちます。別の方法は、リストリソースにPATCH
リクエストを送信することです、/records
、そのボディにはリソースのリストが含まれますそして、それらのリソースで実行するアクション(サポートしたい任意の形式)。これは、要求の応答コードが操作の結果を示すことができる迅速な操作に役立ちます。RESTの制約内ですべてを達成することができます。通常、答えは「問題」をリソースにしてURLを与えることです。
したがって、ここでの削除、リストへの複数のアイテムのPOST、またはリソースのswatheへの同じ編集などのバッチ操作はすべて、「バッチ操作」リストを作成し、新しいPOSTそれへの操作。
RESTが問題を解決する唯一の方法ではないことを忘れないでください。 「REST」は単なる建築スタイルであり、あなたはそれに固執することはありません(ただし、そうしないとインターネットの特定の利点を失います)。 HTTP APIアーキテクチャ のこのリストを見て、自分に合ったものを選ぶことをお勧めします。別のアーキテクチャを選択した場合に失うものを自覚し、ユースケースに基づいて情報に基づいた決定を下してください。
REST Webサービスのバッチ操作を処理するためのパターン? には、この質問に対するいくつかの悪い答えがあります。これは、あまりにも多くの賛成票を持っていますが、読むべきです。
GET /records?filteringCriteria
が基準に一致するすべてのレコードの配列を返す場合、DELETE /records?filteringCriteria
はそのようなレコードをすべて削除できます。
この場合、質問に対する答えはDELETE /records?id=1&id=2&id=3
になります。
Mozilla Storage Service SyncStorage API v1.5は、RESTを使用して複数のレコードを削除する良い方法だと思います。
DELETE https://<endpoint-url>/storage/<collection>
DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>
ids:にあるIDを持つコレクションからBSOを削除しますカンマ区切りリストを提供しました。最大100個のIDを提供できます。
DELETE https://<endpoint-url>/storage/<collection>/<id>
http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
これは、REST規則の灰色の領域のようです。
はい、これまでのところ、バッチ操作(バッチ削除など)に言及しているREST APIデザインガイドは1つしかありません: google APIデザインガイド 。
このガイド メンション コロンを使用してリソースを介して関連付けることができる「カスタム」メソッドの作成。 https://service.name/v1/some/resource/name:customVerb
、また、ユースケースとしてバッチ操作を明示的に言及しています。
カスタムメソッドは、リソース、コレクション、またはサービスに関連付けることができます。任意の要求を受け取り、任意の応答を返すことがあり、ストリーミング要求と応答もサポートします。 [...]カスタムメソッドは、最も柔軟なセマンティクスを備えているため、HTTP POST動詞を使用する必要があります[...]パフォーマンスクリティカルなメソッドの場合、リクエストごとのオーバーヘッドを削減するカスタムバッチメソッド。
したがって、GoogleのAPIガイドに従って次のことができます。
POST /api/path/to/your/collection:batchDelete
...コレクションリソースの多数のアイテムを削除します。
コレクションの大規模な交換を許可しました。 PUT ~/people/123/shoes
ここで、本文はコレクション全体の表現です。
これは、クライアントがアイテムを確認し、一部を削除し、他の一部を追加してからサーバーを更新する必要がある小さな子アイテムのコレクションに対して機能します。空のコレクションをPUTしてすべてを削除できます。
これは、GET ~/people/123/shoes/9
がPUTによって削除されてもキャッシュに残ることを意味しますが、これは単なるキャッシュの問題であり、他の人が靴を削除した場合に問題になります。
私のデータ/システムAPIは、有効期限ではなくETagを常に使用するため、各リクエストでサーバーがヒットし、データを変更するには正しいバージョン/同時実行ヘッダーが必要です。読み取り専用でビュー/レポートに合わせたAPIの場合、有効期限を使用してOriginのヒットを減らします。リーダーボードは10分間有効です。
~/people
のようなはるかに大きなコレクションの場合、複数の削除を必要としない傾向があり、ユースケースは自然に発生しない傾向があるため、単一のDELETEは正常に機能します。
将来、およびREST APIを構築し、監査などの同じ問題と要件を経験した経験から、GETおよびPOST動詞のみを使用し、イベントを中心に設計したいと考えています。例えばPOSTアドレス変更イベント。ただし、独自の問題が発生する可能性があります:)
また、フロントエンド開発者がより厳密なバックエンドAPIを使用する独自のAPIを構築できるようにします。これは、厳密な "Fielding zealot" REST APIが好きではない実用的で有効なクライアント側の理由があることが多いためです生産性とキャッシュレイヤリングの理由によります。
POST、GET、PUTのようなRESTAPIのDELETE HTTPメソッドで複数のパラメーターを送信したい場合は、これを試してください:
DELETE /app/module/test HTTP/1.1
Host: xxx.xxx.x.xx
ACCESS-TOKEN: xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: text/plain
Cache-Control: no-cache
Postman-Token: 3eabfb52-fdb2-4b05-aefa-b2fb0c53c247
first_name=name1&last_name=name2&mobile_no=2222222222&[email protected]
で区切られた各値
&(および署名)
content-Typeはtext/plainORtext あなたの好きなように。
そして、私はサーバーからの応答を受け取りました
そして、これらの応答は郵便局でこのように見えたサーバーから来ました。
Array
(
[first_name] => name1
[last_name] => name2
[mobile_no] => 2222222222
[email_id] => [email protected]
)