請求數據格式
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
,獲取的結果如下: