JavaWeb中的請求數據格式及request和respond


請求數據格式

2.1.1格式介紹

請求數據總共分為三部分內容,分別是請求行請求頭請求體
image

求行包含三塊內容,分別是 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

image

2.2 Request獲取請求數據

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

2.2.1 獲取請求行數據

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

image

對於這三部分內容,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如下:

image

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

String getHeader(String name)

2.2.3 獲取請求體數據

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

image
image

對於請求體中的數據,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,獲取的結果如下:
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM