什么是HTTP協議 ?
- 客戶端連上web服務器后,若想獲得web服務器中的某個web資源,需遵守一定的通訊格式,HTTP協議用于定義客戶端與web服務器通迅的格式
- 使用telnet程序連上web服務器,并使用HTTP協議獲取某個頁面,以快速了解 HTTP協議的作用( Windows_cmd )
- 利用一些瀏覽器的插件可以查看Http協議的詳細內容( 如IE的HttpWatch,火狐的firebug,Ghrome自帶工具 )
HTTP協議簡介
- HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用于定義WEB瀏覽器與WEB服務器之間交換數據的過程。
- HTTP協議是學習JavaWEB開發的基石,不深入了解HTTP協議,就不能說掌握了WEB開發,更無法管理和維護一些復雜的WEB站點。
- HTTP協議就是: 瀏覽器與服務器之間的數據傳輸格式規范
查看Http協議的工具
- 火狐的firebug : 右鍵firbug -> 網絡
- Ghrome自帶工具 : 右鍵審查元素 -> network
- telnet工具 :
- 開啟telnet程序: 控制面板 -> 程序和功能 -> 打開或關閉windows功能 -> 勾上開啟telnet客戶端 ->確定
- telnet如何使用: telnet 主機地址 端口 -> telnet localhost 8080 (就可以看見響應信息)
- control + ] + 回車(可以看到回顯)
HTTP請求
- 請求行 : GET /day09/hello HTTP/1.1
- 請求方式 : POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
- 請求路徑( 請求的資源名稱 ) : 即URI
- URL(統一資源定位符) : 僅可以定位互聯網資源
- URI(統一資源標記符) : 可以標記任何資源, 可以是本地資源文件, 局域網資源, 互聯網資源(URI>URL)
- HTTP協議版本 : HTTP/1.0、HTTP/1.1
- HTTP1.0 與 1.1區別 :
- HTTP1.0協議中, 客戶端與web服務器建立連接后, 只能獲得一個web資源
- HTTP1.1協議中, 允許客戶端與web服務器建立連接后, 在一個連接上獲取多個web資源
- 請求頭 :
- Accept: text/html,image/* -- 瀏覽器接受的數據類型
- Accept-Charset: ISO-8859-1 -- 瀏覽器接受的編碼格式
- Accept-Encoding: gzip,compress --瀏覽器接受的數據壓縮格式
- Accept-Language: en-us,zh- --瀏覽器接受的語言
- Host: www.xxx.org:80 --(必須的)當前請求訪問的目標地址(主機:端口)
- If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --瀏覽器最后的緩存時間
- Referer: http://www.it315.org/index.jsp -- 當前請求來自于哪里
- User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) --瀏覽器類型
- Cookie:name=eric -- 瀏覽器保存的cookie信息
- Connection: close/Keep-Alive -- 瀏覽器跟服務器連接狀態: close: 連接關閉; keep-alive:保存連接
- Date: Tue, 11 Jul 2000 18:23:51 GMT -- 請求發出的時間- 實體內容 :
- Java當中與HTTP請求有關的類 : HttpServletRequest對象(核心的API)
- 請求行:
- request.getMethod(); 請求方式
- request.getRequetURI() / request.getRequetURL() 請求資源
- request.getProtocol() 請求http協議版本
- 請求頭:
- request.getHeader("名稱") 根據請求頭獲取請求值
- request.getHeaderNames() 獲取所有的請求頭名稱
- 實體內容:request.getInputStream() 獲取實體內容數據
- 請求行:
請求參數的獲取與編發問題
- 傳遞的請求參數如何獲取
- GET方式 : 參數放在URI后面
- POST方式 : 參數放在實體內容中
- 獲取GET方式參數 :
request.getQueryString();
- 獲取POST方式參數 :
request.getInputStream();
- 問題:但是以上兩種不通用,而且獲取到的參數還需要進一步地解析。所以可以使用統一方便的獲取參數的方式:
- 核心的API:
-
request.getParameter("參數名");
: 根據參數名獲取參數值(注意,只能獲取一個值的參數) -
request.getParameterValue("參數名“);
: 根據參數名獲取參數值(可以獲取多個值的參數) -
request.getParameterNames();
: 獲取所有參數名稱列表
-
- 核心的API:
String name = req.getParameter("name");
String pwd = req.getParameter("password");
System.out.println(name + ":" + pwd);
Enumeration<String> enums = req.getParameterNames();
while(enums.hasMoreElements()){
String paramName = enums.nextElement();
String paramValue = req.getParameter(paramName);
System.out.println(paramName + ":" + paramValue);
}
請求參數編碼問題
- 修改POST方式參數編碼:
request.setCharacterEncoding("utf-8");
- 修改GET方式參數編碼:
手動解碼:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
HTTP響應
- 響應行
- 狀態碼 : 服務器處理請求的結果(狀態)
- 常見的狀態:
- 200 : 表示請求處理完成并完美返回
- 302 : 表示請求需要進一步細化
- 404 : 表示客戶訪問的資源找不到
- 500 : 表示服務器的資源發送錯誤(服務器內部錯誤)
- 常見的狀態:
- 協議版本 :
- 狀態描述 :
- 狀態碼 : 服務器處理請求的結果(狀態)
- 響應頭
- Location - 表示重定向的地址,該頭和302的狀態碼一起使用。
- Server - 表示服務器的類型
- Content-Encoding - 表示服務器發送給瀏覽器的數據壓縮類型
- Content-Length - 表示服務器發送給瀏覽器的數據長度
- Content-Language - 表示服務器支持的語言
- Content-Type - 表示服務器發送給瀏覽器的數據類型及內容編碼
- Last-Modified - 表示服務器資源的最后修改時間
- Refresh: 1;url=http://www.baidu.com --表示定時刷新
- Content-Disposition - 表示告訴瀏覽器以下載方式打開資源(下載文件時用到)
- Transfer-Encoding: chunked
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search -- 表示服務器發送給瀏覽器的cookie信息 (會話管理用到)
- 表示通知瀏覽器不進行緩存
- Expires: -1
- Cache-Control: no-cache
- Pragma: no-cache
- Connection: close/Keep-Alive : 表示服務器和瀏覽器的連接狀態。close:關閉連接 keep-alive:保存連接
- Java當中與響應有關的類 : HttpServletResponse對象(核心的API)
- HttpServletResponse對象修改響應信息:
- 響應行 : response.setStatus() 設置狀態碼
- 響應頭 : response.setHeader("name","value") 設置響應頭
- 實體內容 :
-
response.getWriter().writer();
: 發送字符實體內容 -
response.getOutputStream().writer();
: 發送字節實體內容
-
- HttpServletResponse對象修改響應信息:
請求重定向 (Location)
定時刷新 (refresh)
content-Type作用
總結
-
http協議: 瀏覽器和服務器之間數據傳輸的格式規范
- http請求:
- 格式:
請求行
請求頭
空行
實體內容(POST提交的數據在實體內容中) - 重點 : 使用HttpServletRequest對象 : 獲取請求數據
- http響應;
- 格式:
響應行
響應頭
空行
實體內容(瀏覽器看到的內容) - 重點 : 使用HttpServletResponse對象 : 設置響應數據