Http協議

什么是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協議的工具

  1. 火狐的firebug : 右鍵firbug -> 網絡
  2. Ghrome自帶工具 : 右鍵審查元素 -> network
  3. telnet工具 :
  • 開啟telnet程序: 控制面板 -> 程序和功能 -> 打開或關閉windows功能 -> 勾上開啟telnet客戶端 ->確定
  • telnet如何使用: telnet 主機地址 端口 -> telnet localhost 8080 (就可以看見響應信息)
    • control + ] + 回車(可以看到回顯)

HTTP請求

  • 請求行 : GET /day09/hello HTTP/1.1
    • 請求方式 : POSTGETHEADOPTIONSDELETETRACEPUT
    • 請求路徑( 請求的資源名稱 ) : 即URI
      • URL(統一資源定位符) : 僅可以定位互聯網資源
      • URI(統一資源標記符) : 可以標記任何資源, 可以是本地資源文件, 局域網資源, 互聯網資源(URI>URL)
    • HTTP協議版本 : HTTP/1.0、HTTP/1.1
    • HTTP1.0 與 1.1區別 :
      1. HTTP1.0協議中, 客戶端與web服務器建立連接后, 只能獲得一個web資源
      2. 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)
    • 請求行:
      1. request.getMethod(); 請求方式
      2. request.getRequetURI() / request.getRequetURL() 請求資源
      3. request.getProtocol() 請求http協議版本
    • 請求頭:
      1. request.getHeader("名稱") 根據請求頭獲取請求值
      2. request.getHeaderNames() 獲取所有的請求頭名稱
    • 實體內容:request.getInputStream() 獲取實體內容數據

請求參數的獲取與編發問題

  • 傳遞的請求參數如何獲取
    • GET方式 : 參數放在URI后面
    • POST方式 : 參數放在實體內容中
  • 獲取GET方式參數 : request.getQueryString();
  • 獲取POST方式參數 : request.getInputStream();
  • 問題:但是以上兩種不通用,而且獲取到的參數還需要進一步地解析。所以可以使用統一方便的獲取參數的方式:
    • 核心的API:
      • request.getParameter("參數名"); : 根據參數名獲取參數值(注意,只能獲取一個值的參數)
      • request.getParameterValue("參數名“); : 根據參數名獲取參數值(可以獲取多個值的參數)
      • request.getParameterNames(); : 獲取所有參數名稱列表
        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(); : 發送字節實體內容

請求重定向 (Location)

定時刷新 (refresh)

content-Type作用

總結

  • http協議: 瀏覽器和服務器之間數據傳輸的格式規范

    1. http請求:
    • 格式:
      請求行
      請求頭
      空行
      實體內容(POST提交的數據在實體內容中)
    • 重點 : 使用HttpServletRequest對象 : 獲取請求數據
    1. http響應;
    • 格式:
      響應行
      響應頭
      空行
      實體內容(瀏覽器看到的內容)
    • 重點 : 使用HttpServletResponse對象 : 設置響應數據
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,420評論 6 152
  • Http協議詳解 標簽(空格分隔): Linux 聲明:本片文章非原創,內容來源于博客園作者MIN飛翔的HTTP協...
    Sivin閱讀 5,252評論 3 82
  • HTTP概述 超文本傳輸協議(HTTP,HyperText Transfer Protocol) 是互聯網上應用最...
    曹淵說創業閱讀 3,861評論 2 61
  • 前言:最近發現自己在網絡相關這一塊基礎很是欠缺,所以準備花時間了解一下,本文主要是講http協議的一些基礎,和一些...
    justCode_閱讀 2,109評論 0 23
  • 本文整理自MIN飛翔博客 [1] 1. 概念 協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規定或...
    HoyaWhite閱讀 2,704評論 2 20