2017-01-20 12 views
2

を使用して複数の項目を削除するには、私は、サプライヤーの製品を表示するAPIを持ってREST APIの設計 - リクエストボディ

当社のUIは、ユーザーがさまざまなフィルタ基準を選択できるようにすると、一度に多数の製品を削除するためにそれを使用します。

DELETE /api/supplier/6/products/5 
DELETE /api/supplier/6/products/7 
DELETE /api/supplier/6/products/8 
DELETE /api/supplier/6/products/10 
... 

意図は一度サプライヤーの製品の束を削除するには、1つのHTTP呼び出しを行うことです。

問題は、それが数千の個々のHTTPが要求を削除しないでください時間がかかりすぎるということです。私たちはから体を取り除い当社の生産プロキシファイアウォールの背後にそれを置くまで、これがうまく

DELETE /api/supplier/6/products 
Body: 
{ 
    "DeleteIds": "[5,7,8,10]" 
} 

:それは私たちが、削除したいすべてのIDのリストを含むように、私は削除するように体を渡すことができますDELETE要求。

HTTP仕様RFC 2616 Fielding, et al.を見てきましたが、DELETEリクエストで本文を使用すべきではないことを明示的には示していません。さらに読むことで、本文の送信に問題はないことがわかりましたDELETE要求

私は私たちのプロキシサーバーを制御しており、すべての要求に対してボディを通過させることができましたが、これはベストプラクティスではないかもしれないと心配しています。私たちは何千ものIDを渡すことができ、長さの制限に耐えることができるので、私たちにヘッダーやURLパラメータが必要ではありません。

だから私の質問は次のとおりです。 要求のボディを使用して複数の製品ために削除を行うには正しい方法でしょうか?意見だけでなく、HTTP DELETEの本文を使用しない理由について実際に文書化された証拠がありますか?

は私が

DELETE /api/supplier/6/products (Using a body) 

を続けるべきか、体でDELETEを使用して、代わりに

POST /api/supplier/6/products/deletemultiple 

編集のようなものにPOSTを行うべきではありません。 この問題のいくつかの良い議論があります: Restful way for deleting a bunch of items 私はDELETE要求の本文をカスタム削除アクションに使用することに関して私の質問には言及しませんが、バッチ削除が起こる可能性のあるさまざまな方法についていくつかの良い議論があります。

+0

私はあなたの最初の確かためのオプションのために行くだろう:私たちはIDのリストを投稿することができた場合に理解したいというPOST – TBD

+0

。それはうまくいくが正しいアプローチではないかもしれない? – bolt19

+0

よりDELETEを使用して、私は同意する DELETE/API /サプライヤー/ 6 /製品 –

答えて

0

私は、いくつかのアイテムを削除アクションに渡したい場合は、POSTを使用し、パラメータとしてint[]を使用していますが、私が呼び出すURLは、慣例を超えて設定しているため、非常に明示的です。

/api/products/DeleteAllById

個々のアイテムを削除する場合は、DELETEを使用します。

+0

/product/deleteallbyid(本文付き) –

+0

うんは、私たちはDELETE/API /製品/ 5 に簡単な で を個々の項目を削除し、私はちょうど(ボディ付)DELETE/API /製品 するかどうか POST/APIを確認していないのに理にかなって – ShaunP

+0

既に 'DELETE'を実装している場合、私の投票は' POST'でしょう。 'POST'はより大きなリクエストを可能にします、と私は信じています。 –

-1

DELETE本体にデータを渡すべきではありません。その代わりに、DELETE urlに項目IDを渡してください。

+0

RFCの[https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)には何もありませんGETまたはDELETEがボディを持つのを止める – ShaunP

+0

@ShaunP http://stackoverflow.com/a/983458/492336によると、「GETのためのサーバーのセマンティクスは、ボディが存在する場合、セマンティックな意味がないように制限されていますリクエスト。" – sashoalm

-1

まず、あなたのリクエストURLの中にあなたのIDを入れて、これが機能するようにする必要があります。

第2に、リクエストをクライアント側でバッチする(固定IDカウントのチャンクに分割する)。 URLの最大長は2000年に制限されていますので、バッチIDカウントを100などに制限することをお勧めします。これにより、パフォーマンスを最大限に引き出し、ネットワーク負荷を最小限に抑えます。

RESTのコンセプトを使用する代わりにこれをハックしてバッチ処理の一般的な手法を使用したい場合は、POSTを使用してバッチ処理について気にしないでください。実際には、HTMLはDELETE =をサポートしていないので、実際には意味があります。/いくつかのフレームワーク(Ruby on Rails、Javascript、AJAXなど)でちょうど偽装されています

+0

私はそれは良い考えです。 IDの数は大幅に異なる可能性があります。好ましいオプションは、要求の本文にIDのリストを送信することです。 –

+0

これは非常に純粋なアプローチですが、UI開発チームからEmberのデータを使用してバッチ処理のメカニズムを作成しなければならないという多くのプッシュバックがあります。 – ShaunP

+0

私の答えが更新されました。 – eocron

関連する問題