2011-05-27 130 views
36

在Web服務我的工作,我需要實現一個與URI查詢參數看起來像/stats?store=A&store=B&item=C&item=D處理多個查詢參數澤西

要打破它,我需要能夠使用查詢參數指定來自多個/所有商店的數據和來自這些商店的多個/所有商品的數據。到目前爲止,我已經能夠實現一個查詢參數,以便拉取項目數據,但是我失去了如何實現更多查詢,並且似乎無法找到我之前見過的資源與此實現。

我至今在我的方法沿着

@GET 
@Path("stats") 
public String methodImCalling(@DefaultValue("All") @QueryParam(value = "item") final String item) 
{ 
    /**Run data using item as variable**/ 
    return someStringOfData 
} 

這對於一個項目運作良好,並且將返回所有的數據,如果我不鍵入URI參數的線條。但是,我不確定如何處理更多的參數。

更新

我已想出如何通過簡單地添加第二個參數的方法,像這樣使用2個不同的參數:

public String methodImCalling(@DefaultValue("All") @QueryParam(value = "store") final String store, 
    @DefaultValue("All") @QueryParam(value = "item") final String item) 

問題仍然如何實現多個值的相同參數。

+1

您可以通過編寫來簡化您的代碼:@QueryParam(「store」) – Vincent 2013-01-11 07:28:52

回答

71

如果將item方法參數的類型從String更改爲諸如List<String>的集合,則應該得到一個集合,該集合包含要查找的所有值。

@GET 
@Path("/foo") 
@Produces("text/plain") 
public String methodImCalling(@DefaultValue("All") 
           @QueryParam(value = "item") 
           final List<String> item) { 
    return "values are " + item; 
} 

的JAX-RS規範(3.2節)表示關於@QueryParam註解如下:

的支持以下類型:
  1. 基本類型
  2. 具有一個接受構造類型一個String參數。
  3. 類型具有名爲valueOf的靜態方法,其中有一個參數String。其中T滿足以上2或3。
+0

定義列表不起作用。我認爲ArrayList 將用於相同的目的? – ZKSteffel 2011-05-27 18:21:54

+0

'List item'沒有工作,'ArrayList item'只是打破了我的代碼...任何其他建議? – ZKSteffel 2011-05-27 19:06:59

+0

@ZSteffel:不知道爲什麼它不起作用,因爲我做了一個快速測試,它爲我工作。我將編輯我的答案以顯示我使用的完整方法。你能給我更多關於失敗的信息嗎? – stand 2011-05-27 19:38:21

10

List<String> items=ui.getQueryParameters().get("item");

其中ui聲明爲在像這樣剩下的資源的成員:

@Context UriInfo ui; 

的缺點是,它根本不會出現在方法的參數。

+1

雖然這張海報回答了錯誤的問題,但是這是我Google搜索的問題,所以我必須對它進行提示,因爲它對我有幫助。 @Tal謝謝。 – JSager 2013-10-18 20:00:25

2

像axios js這樣的一些庫在發送多值參數請求時使用方括號表示法:/ stats?存儲[] = A &商店[] = B &項[] = C &項[] = d

爲了處理所有的情況下(有或沒有方括號),則可以添加其他PARAM這樣的:

public String methodImCalling(
    @QueryParam(value = "store") final List<String> store, 
    @QueryParam(value = "store[]") final List<String> storeWithBrackets, 
    @QueryParam(value = "item") final List<String> item, 
    @QueryParam(value = "item[]") final List<String> itemWithBrackets) { 
... 
} 

檢查每個檢查null的參數。