1. 程式人生 > >request.getParameter()、request.getInputStream()和request.getReader()

request.getParameter()、request.getInputStream()和request.getReader()

req 字符 操作 沒有 影響 -type 字符流 客戶 multi

request.getParameter()、request.getInputStream()和request.getReader()

request的Content-Type小結

application/x- www-form-urlencoded是Post請求默認的請求體內容類型,也是form表單默認的類型。Servlet API規範中對該類型的請求內容提供了request.getParameter()方法來獲取請求參數值。但當請求內容不是該類型時,需要調用request.getInputStream()或request.getReader()方法來獲取請求內容值。

當請求體內容(註意:get請求沒有請求體)類型是application/x- www-form-urlencoded時也可以直接調用request.getInputStream()或request.getReader()方法獲取到請求內容再解析出具體都參數,但前提是還沒調用request.getParameter()方法。此時當request.getInputStream()或request.getReader()獲取到請求內容後,無法再調request.getParameter()獲取請求內容。即對該類型的請求,三個方法互斥,只能調其中一個。今天遇到一個Controller請求經過Spring MVC 的RequestMapping處理後,只能通過request.getParameter()獲取到參數、無法通過request.getInputStream()和request.getReader()讀取內容很可能就是因為在請求經過Spring MVC時已調用過request.getParameter()方法的原因。

註意:在一個請求鏈中,請求對象被前面對象方法中調用request.getInputStream()或request.getReader()獲取過內容後,後面的對象方法裏再調用這兩個方法也無法獲取到客戶端請求的內容,但是調用request.getParameter()方法獲取過內容後,後面的對象方法裏依然可以調用它獲取到參數的內容。

當請求體內容是其它類型時,比如 multipart/form-data或application/json時,無法通過request.getParameter()獲取到請求內容,此時只能通過request.getInputStream()和request.getReader()方法獲取請求內容,此時調用request.getParameter()也不會影響第一次調用request.getInputStream()或request.getReader()獲取到請求內容。

request.getInputStream()返回請求內容字節流,多用於文件上傳,request.getReader()是對前者返回內容的封裝,可以讓調用者更方便字符內容的處理(不用自己先獲取字節流再做字符流的轉換操作)。

request.getParameter()、request.getInputStream()和request.getReader()