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
,獲取的結果如下: