HTTP请求消息数据格式分析以及request和response
* HTTP概念
Hyper Text Transfer Protocol 超文本傳輸協議
?? ??? ?* 傳輸協議:定義了,客戶端和服務器端通信時,發送數據的格式
?? ??? ?* 特點:
?? ??? ??? ?1. 基于TCP/IP的高級協議
?? ??? ??? ?2. 默認端口號:80
?? ??? ??? ?3. 基于請求/響應模型的:一次請求對應一次響應
?? ??? ??? ?4. 無狀態的:每次請求之間相互獨立,不能交互數據
?? ??? ?* 歷史版本:
?? ??? ??? ?* 1.0:每一次請求響應都會建立新的連接
?? ??? ??? ?* 1.1:復用連接
* 請求消息數據格式
?? ??? ?1. 請求行
?? ??? ??? ?請求方式 請求url 請求協議/版本
?? ??? ??? ?GET /login.html?? ?HTTP/1.1
?? ??? ??? ?* 請求方式:
?? ??? ??? ??? ?* HTTP協議有7中請求方式,常用的有2種
?? ??? ??? ??? ??? ?* GET:
?? ??? ??? ??? ??? ??? ?1. 請求參數在請求行中,在url后。
?? ??? ??? ??? ??? ??? ?2. 請求的url長度有限制的
?? ??? ??? ??? ??? ??? ?3. 不太安全
?? ??? ??? ??? ??? ?* POST:
?? ??? ??? ??? ??? ??? ?1. 請求參數在請求體中
?? ??? ??? ??? ??? ??? ?2. 請求的url長度沒有限制的
?? ??? ??? ??? ??? ??? ?3. 相對安全
?? ??? ?2. 請求頭:客戶端瀏覽器去告訴服務器一些信息(主要是我使用的瀏覽器和我從哪個網頁來的)
?? ??? ??? ?請求頭名稱: 請求頭值
?? ??? ??? ?* 常見的請求頭:
?? ??? ??? ??? ?1. User-Agent:瀏覽器告訴服務器,我訪問你使用的瀏覽器版本信息
?? ??? ??? ??? ??? ?* 可以在服務器端獲取該頭的信息,解決瀏覽器的兼容性問題
?? ??? ??? ??? ?2. Referer:http://localhost/login.html
?? ??? ??? ??? ??? ?* 告訴服務器,我(當前請求)從哪里來?
?? ??? ??? ??? ??? ??? ?* 作用:
?? ??? ??? ??? ??? ??? ??? ?1. 防盜鏈:
?? ??? ??? ??? ??? ??? ??? ?2. 統計工作:
?? ??? ?3. 請求空行
?? ??? ??? ?空行,就是用于分割POST請求的請求頭,和請求體的。
?? ??? ?4. 請求體(正文):
?? ??? ??? ?* 封裝POST請求消息的請求參數的
?? ??? ?* 字符串格式:
?? ??? ??? ?POST /login.html?? ?HTTP/1.1
?? ??? ??? ?Host: localhost
?? ??? ??? ?User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
?? ??? ??? ?Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
?? ??? ??? ?Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
?? ??? ??? ?Accept-Encoding: gzip, deflate
?? ??? ??? ?Referer: http://localhost/login.html
?? ??? ??? ?Connection: keep-alive
?? ??? ??? ?Upgrade-Insecure-Requests: 1
?? ??? ??? ?username=zhangsan?? ?
?? ?* 響應消息數據格式
## Request:
?? ?1. request對象和response對象的原理
?? ??? ?1. request和response對象是由服務器創建的。我們來使用它們
?? ??? ?2. request對象是來獲取請求消息,response對象是來設置響應消息
?? ?
?? ?2. request對象繼承體系結構:?? ?
?? ??? ?ServletRequest?? ??? ?--?? ?接口
?? ??? ??? ?|?? ?繼承
?? ??? ?HttpServletRequest?? ?-- 接口
?? ??? ??? ?|?? ?實現
?? ??? ?org.apache.catalina.connector.RequestFacade 類(tomcat)
?? ?3. request功能:
?? ????1. 獲取請求消息數據
?? ??? ??? ?1. 獲取請求行數據
?? ??? ??? ??? ?* GET /day14/demo1?name=zhangsan HTTP/1.1
?? ??? ??? ??? ?* 方法:
?? ??? ??? ??? ??? ?1. 獲取請求方式 :GET
?? ??? ??? ??? ??? ??? ?* String getMethod() ?
?? ??? ??? ??? ??? ?2. (*)獲取虛擬目錄:/day14
?? ??? ??? ??? ??? ??? ?* String getContextPath()
?? ??? ??? ??? ??? ?3. 獲取Servlet路徑: /demo1
?? ??? ??? ??? ??? ??? ?* String getServletPath()
?? ??? ??? ??? ??? ?4. 獲取get方式請求參數:name=zhangsan
?? ??? ??? ??? ??? ??? ?* String getQueryString()
?? ??? ??? ??? ??? ?5. (*)獲取請求URI:/day14/demo1
?? ??? ??? ??? ??? ??? ?* String getRequestURI():?? ??? ?/day14/demo1
?? ??? ??? ??? ??? ??? ?* StringBuffer getRequestURL() ?:http://localhost/day14/demo1
?? ??? ??? ??? ??? ??? ?* URL:統一資源定位符 : http://localhost/day14/demo1?? ?中華人民共和國
?? ??? ??? ??? ??? ??? ?* URI:統一資源標識符 : /day14/demo1?? ??? ??? ??? ??? ?共和國
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?6. 獲取協議及版本:HTTP/1.1
?? ??? ??? ??? ??? ??? ?* String getProtocol()
?? ??? ??? ??? ??? ?7. 獲取客戶機的IP地址:
?? ??? ??? ??? ??? ??? ?* String getRemoteAddr()
?? ??? ??? ??? ??? ?
?? ??? ??2. 獲取請求頭數據
?? ??? ??? ??? ?* 方法:
?? ??? ??? ??? ??? ?* (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
?? ??? ??? ??? ??? ?* Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?//獲取所有的請求頭名稱
?? ??? ??? ??? ?Enumeration<String> headEnumeration=request.getHeaderNames();
?? ??? ??? ??? ?//遍歷
?? ??? ??? ??? ?while (headEnumeration.hasMoreElements()) {
?? ??? ??? ??? ??? ?String name = (String) headEnumeration.nextElement();
?? ??? ??? ??? ??? ?//根據請求頭部名稱獲取請求頭部值
?? ??? ??? ??? ??? ?String valueString=request.getHeader(name);
?? ??? ??? ??? ??? ?System.out.println(name+"---"+valueString);
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ? ? ?3. 獲取請求體數據:
?? ??? ??? ??? ?* 請求體:只有POST請求方式,才有請求體,在請求體中封裝了POST請求的請求參數
?? ??? ??? ??? ?* 步驟:
?? ??? ??? ??? ??? ?1. 獲取流對象
?? ??? ??? ??? ??? ??? ?* ?BufferedReader getReader():獲取字符輸入流,只能操作字符數據
?? ??? ??? ??? ??? ??? ?* ?ServletInputStream getInputStream():獲取字節輸入流,可以操作所有類型數據
?? ??? ??? ??? ??? ??? ??? ?* 在文件上傳知識點后講解
?? ??? ??? ??? ??? ?2. 再從流對象中拿數據
?? ??? ??? ??? ?
?? ??? ??? ???
??2. 其他功能:
?? ??? ??? ?1. 獲取請求參數通用方式:不論get還是post請求方式都可以使用下列方法來獲取請求參數
?? ??? ??? ??? ?1.1. String getParameter(String name):根據參數名稱獲取參數值 ? ?username=zs&password=123
?? ??? ??? ??? ?1.2?String[] getParameterValues(String name):根據參數名稱獲取參數值的數組 ?hobby=xx&hobby=game
? ? ? ? ? ? ? ? 1.3. Enumeration<String> getParameterNames():獲取所有請求的參數名稱
? ? ? ? ? ? ? ? 1.4. Map<String,String[]> getParameterMap():獲取所有參數的map集合
?? ??? ??? ??? ?* 中文亂碼問題:
?? ??? ??? ??? ??? ?* get方式:tomcat 8 已經將get方式亂碼問題解決了
?? ??? ??? ??? ??? ?* post方式:會亂碼
?? ??? ??? ??? ??? ??? ?* 解決:在獲取參數前,設置request的編碼request.setCharacterEncoding("utf-8");
? ? ? ? ? ?
? ? ? ? ? ?2. 請求轉發:一種在服務器內部的資源跳轉方式
?? ??? ??? ??? ?1. 步驟:
?? ??? ??? ??? ??? ?1. 通過request對象獲取請求轉發器對象:RequestDispatcher? ? ? ? ? ? ? ? ? ? ? ? ?getRequestDispatcher(String path)
?? ??? ??? ??? ??? ?2. 使用RequestDispatcher對象來進行轉發:forward(ServletRequest request,? ?ServletResponse response)?
?? ??? ??? ??? ?2. 特點:
?? ??? ??? ??? ??? ?1. 瀏覽器地址欄路徑不發生變化
?? ??? ??? ??? ??? ?2. 只能轉發到當前服務器內部資源中。
?? ??? ??? ??? ??? ?3. 轉發是一次請求
?? ??? ? ? 3. 共享數據:
?? ??? ??? ??? ?* 域對象:一個有作用范圍的對象,可以在范圍內共享數據
?? ??? ??? ??? ?* request域:代表一次請求的范圍,一般用于請求轉發的多個資源中共享數據
?? ??? ??? ??? ?* 方法:
?? ??? ??? ??? ??? ?1. void setAttribute(String name,Object obj):存儲數據
?? ??? ??? ??? ??? ?2. Object getAttitude(String name):通過鍵獲取值
?? ??? ??? ??? ??? ?3. void removeAttribute(String name):通過鍵移除鍵值對
?? ??? ???4. 獲取ServletContext:
?? ??? ??? ??? ?* ServletContext getServletContext()
ps:response方法下一次再講解。。。
總結
以上是生活随笔為你收集整理的HTTP请求消息数据格式分析以及request和response的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yolov4的全面详解
- 下一篇: argparse.ArgumentPar