2016-11-01 73 views
1

我希望能夠在運行時動態地獲取傳遞給POST請求的參數,就像可以使用GET一樣完成。Java Jax-R在運行時動態獲取POST參數,如GET

我需要的參數是通過傳遞的參數之一定義的,我不知道它們在讀取之前是什麼。

實施例:

如果我傳遞給請求的參數「類型=球員」,我可以推斷,傳遞給該請求的其他PARAMS是「id」和「名」,但我不能直到我讀到「類型」參數才知道它。

在另一種情況中,參數「類型=項目」可能被傳遞,然後我可以推斷,通過其他PARAMS是「數量」和「質量」。當我使用GET時,我可以使用request.getParameter(「type」),然後理解我在找什麼其他參數(請求是HttpServletRequest)。 例如這樣做:

if (request.getParameter("type") == "player") { 
    doSomething(request.getParameter("id"), request.getParameter("name")) 
} 
else if (request.getParameter("type") == "item") { 
    doSomethingElse(request.getParameter("quantity"), request.getParameter("quality")) 
} 

然而,當我使用POST,從我讀到目前爲止,我必須定義什麼參數,我在期待事先通過。

舉例來說,如果POST消耗JSON,我會在構造函數中指定爲曾經的請求作出的JSON將被解析編譯Java對象。

由於Java對象是在編譯時定義的,我無法動態地接受和推導不同的參數。

有沒有一種方法可以動態地訪問傳遞給POST的參數,這與GET可以做到的方式相同?

回答

0

很容易得到充分的身體,只是這樣做:

@POST 
public Response go(String requestBody) throws IOException { 
    //parse the variable requestBody to get the parameters... 
} 

字符串變量requestBody的價值包含了所有的POST體。

然而,以方便您的生活提供了新澤西州:

@POST 
@Consumes("application/x-www-form-urlencoded") 
public void post(MultivaluedMap<String, String> formParams) { 
    // Store the message 
} 

在地圖formParams的關鍵是你的表單POST參數。

+0

感謝您的回覆。我收到以下錯誤,當我使用MultivaluedMap解決方案: com.fasterxml.jackson.databind.JsonMappingException:無法找到非混凝土地圖類型[圖式解串器;類javax.ws.rs.core.MultivaluedMap,[簡單類型,類java.lang.String] - > [集合類型;類的java.util.List,包含[簡單類型,類java.lang.String]]] 我不寫@Consumes( 「應用程序/ x WWW的形式進行了urlencoded」)雖然。當我這樣做時,即使我向請求中添加了「Accept」標頭,這也是我在類似問題中發現的錯誤,但我得到了不受支持的媒體錯誤。 –

+0

這取決於你在發佈什麼。如果您發佈JSON,則應將@Consumes註釋發送到「application/json」,在上述情況下,我假定您正在發佈表單數據。 – Alboz

+0

我明白了。我添加了一個@Consumes json,它看起來在有和沒有的情況下是一樣的,就好像Java在運行時推斷類型一樣。我仍然遇到錯誤,也許我沒有從正確的包中加載MultivaluedMap? com.fasterxml.jackson.databind.JsonMappingException:無法爲非具體的Map類型找到反序列化器[map type;類javax.ws.rs.core.MultivaluedMap,[簡單類型,類java.lang.String] - > [集合類型;類java.util.List,包含[簡單類型,類java.lang.String]]] –