天天看點

Java HttpRequest 詳解

文章轉自 https://yq.aliyun.com/articles/650312?accounttraceid=94d95fb493324bb2b44bbb9b538f15b0ycge

HttpServlet 類需要兩個參數HttpRequest和HttpResponse。比如doGet方法

protected void doGet(

HttpServletRequest request,
HttpServletResponse response)
  throws ServletException, IOException {           

}

那我在這先介紹HttpRequest。

HttpRequest對象的目的是代替浏覽器把Http請求發送給web應用,是以,任何浏覽器能發送的,HttpRequest都可以接受到。

HttpRequest對象有很多方法,這裡隻介紹重要的,剩餘的有興趣的話你可以自己看JavaDoc。

參數

請求參數是從浏覽器連同請求一起發送的參數。 請求參數通常作為URL的一部分(在“查詢字元串”中)或作為HTTP請求主體的一部分發送。 例如:

www.baidu.com?param1=hello&param2=world

在這個URL中,有兩個參數

param1=hello

param2=world

你可以用HttpRequest通路這些參數,例如:

protected void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException {

String param1 = request.getParameter("param1");
    String param2 = request.getParameter("param2");
           

通常,如果浏覽器發送HTTP GET請求,則參數将包含在URL中的查詢字元串中。 如果浏覽器發送HTTP POST請求,則參數将包含在HTTP請求的正文部分(form)中。

請求頭

請求頭是浏覽器伴随HttpRequest發送的的一個'鍵值對',請求标題包含關于例如 使用什麼浏覽器軟體,浏覽器能夠接收哪些檔案類型等等。

我們可以使用HttpRequest對象來接受請求頭:

String contentLength = request.getHeader("Content-Length");

Content-Length頭包含在HTTP請求正文中發送的位元組數,以防浏覽器發送HTTP POST請求。 如果浏覽器發送HTTP GET請求,則不使用Content-Length标頭,并且上述代碼将傳回null。

輸入流

如果浏覽器發送HTTP POST請求,請求參數和其他潛在資料将發送到HTTP請求正文中的伺服器。 它不一定是在HTTP請求主體中發送的請求參數。 它可能幾乎是任何資料,如檔案或SOAP請求(Web服務請求)。

為了可以通路HTTP POST請求的主題内容,我們可以用inputStream。這是一個例子:

InputStream requestBodyInput = request.getInputStream();

注意:在調用任何getParameter()方法之前,您必須調用此方法,因為在HTTP POST請求上調用getParameter()方法将導緻servlet引擎 解析 HTTP請求主體 以 擷取參數。 一旦分析完畢,就無法再以原始位元組流的形式通路主體。

Session

也可以從HttpRequest對象擷取Session對象。

Session對象可以在請求之間儲存關于給定使用者的資訊。 是以,如果您在一個請求期間将對象設定為會話對象,則它可供您在同一會話時間範圍内的任何後續請求和期間讀取。

這裡是如何擷取Session對象:

HttpSession session = request.getSession();

ServletContext

也可以從HttpRequest對象中擷取ServletContext對象。ServletContext包含一些web應用資訊。例如,能擷取到web.xml檔案裡的一些參數,也能将request請求轉發給别的Servlet,也能在ServletContext裡存儲一些應用參數。

這是擷取ServletContext的例子:

ServletContext context = request.getSession().getServletContext();

可以看到,我們要先擷取Session對象,再擷取ServletContext。