2012-12-09 7 views
7

私はRESTful APIを設計しています。HTTP GETの複数のKey-ValueパラメータのREST URIを設計する方法

1つのサービスは、複数のキーと値のペアに対してクエリ機能を提供する必要があります。たとえば、クライアントは、異なる製品および関連する数量に対して1つのHTTP GET要求を照会することができます。私は知らないので

/produkt?productId1=1&productquantity1=44&productId2=2&productquantity2=55 

:クライアントは、私は実際に私のURIは次のようになりたくない量55 と量44と製品2と製品1を照会したい

クエリされる商品の数。

またはこのような:

/produkt?product=1,44&product=2,55 

どのようにクライアントがカンマの前のProductIDとカンマの後の数量があることを知ることができるからです。

他に解決策がありますか?または、1つのリクエストで複数の製品を照会する可能性を提供することは、RESTfulではありませんか?関連する数量を持つ1つの製品だけを照会する可能性を提供する方が良いでしょうか?クライアントがより多くの製品を照会したい場合は、より多くの要求を送信する必要がありますか?

+0

http-postにクエリ情報を入力すると何が問題になるでしょうか? – schippi

+2

@schippi RESTfulでないものを除いては何もありません:) – dasblinkenlight

+0

RESTfulなWebサービスは、排他的にGETに基づいている必要はありません。GETリクエストに含めることができるよりも多くのデータの送信を必要とするRESTfulなサービスを簡単に持つことができます。任意のHTTPメソッドを使用することが妥当です。参照してください:http://en.wikipedia.org/wiki/Representational_state_transfer#Vocabulary_re-use_vs._its_arbitrary_extension:_HTTP_and_SOAP – Michael

答えて

2

注文の内容が*ではないため、製品の部分に明示的な名前を追加し、コンマの代わりにセミコロンを使用することで、2番目の提案を少し拡大します。

/products?id=1;qty=44&qty=55;id=2 

属性の順序は重要ではありませんので、idqtyは、第二製品の周りに切り替えられるかに注意してください。


*は、順序が重要でないときの順序が重要であり、セミコロンするときにコンマを使用する慣習があります。ここで

+0

これらのパラメータをRESTサービスに挿入するにはどうすればよいですか?私は@ QueryParam-Annotationを使用する必要がありますが、どうすればよいですか? – joshi737

5

は、パラメータを渡すために1つのアイデアです:

[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

はそうあなたが簡単にクエリパラメータを変換することができList<kv>クラス

class kv { 
    String key; 
    String value; 


    public kv(String key, String value) { 
     super(); 
     this.key = key; 
     this.value = value; 
    } 

    public String getKey() { 
     return key; 
    } 

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

のJSON表現です

/products?productDetail=[{"key":"key0","value":"key1"},{"key":"key2","value":"key2"},{"key":"key3","value":"key3"}] 

productDetailからList<kv>まで

new Gson().fromJson(productDetail,kv.class); 

あなたは簡単にすべての要素を反復することができます。

もう1つの提案は、クエリされた商品の数がわからない場合は、POST要求を使用することです。

+0

この考え方のように、私はGETクエリを使用する代わりに、JSONを置くこと(クエリは冪等でなければならない)を検討します。 – Stefan

関連する問題