2017-01-19 6 views
2

製品のリソースコレクションは/productsです。RESTful APIです。クエリ文字列の長さが十分でない場合はどうなりますか?

このコレクションをフィルタリングして、特定のリストclassidのいずれかを持つメンバーのみを返すようにしたいとします。たとえば:

GET /products?classes=100,101,102

これは、列挙されたクラスのいずれかを持っている製品のメンバーのコレクションを返す必要があります。

問題は、何千もの製品とクラスで作業していることです。したがって、idのクラスリストは、クエリ文字列では長すぎる可能性があります。

いつでも可能な限りRESTfulな原則に固執したいので、/products?classes=100,101,102GETと呼ばれるリソースは、フィルタリングされた商品コレクションを返します。

idのリストをJSON形式で本文に含めることはできますが、GET /productsという呼び出しはリソースの状態(リソースはURL)の表現を返しません。フィルタオプションを提供するためにボディが使用されています。

フィルタリングされたコレクションをリクエストするには最適な方法はありますが、フィルタオプションが長すぎてクエリ文字列..を使用できません。

+0

興味深い質問!しかし、GETリクエストはとにかにペイロードを保持することはできません... – sp00m

+0

あなたはそれをPOSTにして、フィルタの条件をリクエスト本体に入れますが、リクエストヘッダX-HTTP-Method-Overrideを使ってGETのように扱いたいことを示します。私は様々な理由で許可されていないPUTまたはDELETEを回避する方法としてこれを見てきました。あなたがGETのためにこれを行うことができる合理的だと思われます。参照:http://www.hanselman.com/blog/HTTPPUTOrDELETENotAllowedUseXHTTPMethodOverrideForYourRESTServiceWithASPNETWebAPI.aspx –

+1

@ sp00m実際に[GET](https://tools.ietf.org/html/rfc7231#section-4.3.1)リクエストはペイロードを保持できますしかし、セマンティクスは定義されていません。さらに、要求が古いHTTPサーバーによって拒否される可能性があるため、ペイロードを含めることは推奨されません。 –

答えて

0

@Cからの面白いコメント。スミス氏はX-HTTP-Method-OverrideヘッダーをGETに設定し、idをボディに渡してPOSTコールを発信することを提案しています。これはうまくいくでしょう。

考えてみたら、クエリ文字列に許可されているクラスidの数を制限し、複数の呼び出しを行い、idのリストを200のグループに分割することをお勧めします。 200を超えるとエラーが返されます。

GET /products?classes=1004,2342,8753...

(200 idに限定年代)

GET /products?classes=2326,3343,6981...(200 idに限定年代)

そして結果を容易にした後、一緒にステッチすることができます。

この方法では、たとえば、電話を25回行うことで5,000 idを使用できます。理想的ではありませんが、このユースケースでは問題ありません。

+0

あなたのユースケースにもよりますが、範囲が役に立つ場合もあります。 '100-101,102'の代わりに' [100-102] 'を使います。 – sp00m

+0

'id'はほとんど決して連続しません。 –

関連する問題