1. 程式人生 > 其它 >JavaWeb中的請求資料格式及request和respond

JavaWeb中的請求資料格式及request和respond

請求資料格式

2.1.1格式介紹

請求資料總共分為三部分內容,分別是請求行請求頭請求體

求行包含三塊內容,分別是 GET[請求方式] /[請求URL路徑] HTTP/1.1[HTTP協議及版本]

請求方式有七種,最常用的是GET和POST

  • 請求頭: 第二行開始,格式為key: value形式

    請求頭中會包含若干個屬性,常見的HTTP請求頭有:

    Host: 表示請求的主機名
    User-Agent: 瀏覽器版本,例如Chrome瀏覽器的標識類似Mozilla/5.0 ...Chrome/79,IE瀏覽器的標識類似Mozilla/5.0 (Windows NT ...)like Gecko;
    Accept:表示瀏覽器能接收的資源型別,如text/*,image/*或者*/*表示所有;
    Accept-Language:表示瀏覽器偏好的語言,伺服器可以據此返回不同語言的網頁;
    Accept-Encoding:表示瀏覽器可以支援的壓縮型別,例如gzip, deflate等。
    

    這些資料有什麼用處?

    舉例說明:服務端可以根據請求頭中的內容來獲取客戶端的相關資訊,有了這些資訊服務端就可以處理不同的業務需求,比如:

    • 不同瀏覽器解析HTML和CSS標籤的結果會有不一致,所以就會導致相同的程式碼在不同的瀏覽器會出現不同的效果
    • 服務端根據客戶端請求頭中的資料獲取到客戶端的瀏覽器型別,就可以根據不同的瀏覽器設定不同的程式碼來達到一致的效果
    • 就是我們常說的瀏覽器相容問題
    • 請求體: POST請求的最後一部分,儲存請求引數

    如上圖紅線框的內容就是請求體的內容,請求體和請求頭之間是有一個空行隔開。此時瀏覽器傳送的是POST請求,為什麼不能使用GET呢?這時就需要回顧GET和POST兩個請求之間的區別了:

    • GET請求請求引數在請求行中,沒有請求體,POST請求請求引數在請求體中
    • GET請求請求引數大小有限制,POST沒有

2.1 Request繼承體系

在學習這節內容之前,我們先思考一個問題,前面在介紹Request和Reponse物件的時候,比較細心的同學可能已經發現:

  • 當我們的Servlet類實現的是Servlet介面的時候,service方法中的引數是ServletRequest和ServletResponse
  • 當我們的Servlet類繼承的是HttpServlet類的時候,doGet和doPost方法中的引數就變成HttpServletRequest和HttpServletReponse

2.2 Request獲取請求資料

HTTP請求資料總共分為三部分內容,分別是請求行、請求頭、請求體,對於這三部分內容的資料,分別該如何獲取,首先我們先來學習請求行資料如何獲取?

2.2.1 獲取請求行資料

請求行包含三塊內容,分別是請求方式請求資源路徑HTTP協議及版本

對於這三部分內容,request物件都提供了對應的API方法來獲取,具體如下:

  • 獲取請求方式: GET
String getMethod()
  • 獲取虛擬目錄(專案訪問路徑): /request-demo
String getContextPath()
  • 獲取URL(統一資源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
  • 獲取URI(統一資源識別符號): /request-demo/req1
String getRequestURI()
  • 獲取請求引數(GET方式): username=zhangsan&password=123
String getQueryString()

2.2.2 獲取請求頭資料

對於請求頭的資料,格式為key: value如下:

所以根據請求頭名稱獲取對應值的方法為:

String getHeader(String name)

2.2.3 獲取請求體資料

瀏覽器在傳送GET請求的時候是沒有請求體的,所以需要把請求方式變更為POST,請求體中的資料格式如下:


對於請求體中的資料,Request物件提供瞭如下兩種方式來獲取其中的資料,分別是:

  • 獲取位元組輸入流,如果前端傳送的是位元組資料,比如傳遞的是檔案資料,則使用該方法
ServletInputStream getInputStream()
該方法可以獲取位元組
  • 獲取字元輸入流,如果前端傳送的是純文字資料,則使用該方法
BufferedReader getReader()

通過程式碼把上述方法都使用下:

/**
 * request 獲取請求資料
 */
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // String getMethod():獲取請求方式: GET
        String method = req.getMethod();
        System.out.println(method);//GET
        // String getContextPath():獲取虛擬目錄(專案訪問路徑):/request-demo
        String contextPath = req.getContextPath();
        System.out.println(contextPath);
        // StringBuffer getRequestURL(): 獲取URL(統一資源定位符):http://localhost:8080/request-demo/req1
        StringBuffer url = req.getRequestURL();
        System.out.println(url.toString());
        // String getRequestURI():獲取URI(統一資源識別符號): /request-demo/req1
        String uri = req.getRequestURI();
        System.out.println(uri);
        // String getQueryString():獲取請求引數(GET方式): username=zhangsan
        String queryString = req.getQueryString();
        System.out.println(queryString);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}

啟動伺服器,訪問http://localhost:8080/request-demo/req1?username=zhangsan&passwrod=123,獲取的結果如下: