2012-12-09 18 views
7

我正在設計一個RESTful API。如何爲HTTP的多個鍵值參數設計REST URI獲取

一個服務應該爲多個鍵值對提供查詢功能。例如,客戶端可以通過一個HTTP GET請求查詢不同的產品和相關數量。

客戶想查詢產品1與55 其實我不希望我的URI看起來像這樣量44和產品2與量:

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

,因爲我不知道有多少產品被查詢。

或者這樣:

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

因爲客戶端怎麼能知道逗號之前存在產品ID和逗號的數量後。

有沒有人有其他解決方案?或者,提供用一個請求查詢多個產品的可能性不是RESTful?提供用相關數量查詢一個產品的可能性是否更好?如果客戶想要查詢更多產品,他們應該發送更多請求?

+0

將查詢信息放入http-post會有什麼問題? – schippi

+2

@schippi沒有什麼,但那不會是REST風格:) – dasblinkenlight

+0

REST風格的Web服務不必完全基於GET。你可以很容易地獲得一個RESTful服務,它需要傳輸比GET請求中包含的數據更多的數據。使用任何HTTP方法是合理的。請參閱:http://en.wikipedia.org/wiki/Representational_state_transfer#Vocabulary_re-use_vs._its_arbitrary_extension:_HTTP_and_SOAP – Michael

回答

2

我會通過爲產品的各個部分添加顯式名稱,並使用分號代替逗號來分隔產品屬性來擴展您的第二條建議,因爲訂單無關緊要*

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

注意如何idqty圍繞切換爲第二產品,因爲屬性的順序並不重要。


*還有就是用逗號時的順序很重要,和分號當順序並不重要的約定。

+0

如何將這些參數注入到我的REST服務中?我知道,我必須使用@ QueryParam-Annotation,但我應該如何使用它? – joshi737

5

這裏是一個想法傳遞一個參數:

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

其中

[{"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表示productDetail in至List<kv>使用

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

比您可以輕鬆地迭代所有元素。

另一個建議是,如果您不知道有多少產品被查詢,請使用POST請求。

+0

像這個想法,我會考慮把(查詢應該是idempotent)JSON,而不是使用GET查詢。 – Stefan