星期三, 4月 10, 2013

HTTPServletRequest POST 取不到資料


最近碰到一個問題,透過 HttpClient POST XML 資料給 Servlet,會一直抓不到資料。
但若透過 REST-Console POST XML 資料給該 Servlet,該 Servlet 又抓得到資料。

問題確實很詭異。

追查到最後,發現是有一隻 filter,呼叫了 request.getParameter("xx") 原因造成。
那為何 request.getParameter 會造成此問題呢?

看看 API 怎麼說明:
If the parameter data was sent in the request body, such as occurs with an HTTP POST request, then reading the body directly via getInputStream() or getReader() can interfere with the execution of this method.

看來送出 POST 由於可能 Request 裡也會有參數,因此就會透過 getInputStream() 來讀取。
因此到該 Servlet 後,再去讀取時,就都抓不到資料了。

那可以解釋為何 HttpClient POST 會抓不到資料,但無法解釋為何透過 REST-Console 來 POST 就可以抓到資料。

最後,查看此兩者所送出之 Header。

HttpClient 會送出 Content-Type: application/x-www-form-urlencoded
而 REST-Console 會送出  Content-Type: application/xml

這就是原因所在了。

由於送出的 header 為 x-www-form-urlencoded。
代表其內容也為 parameter 的格式,自然 getParameter 就會去讀取 Body 內的值。

而 InputStream 讀完了,自然也再讀不出資料來了。

0 Comments:

張貼留言

<< Home