1. 程式人生 > >Http協議——get和post請求

Http協議——get和post請求

開發十年,就只剩下這套架構體系了! >>>   

目錄
    1、Http請求協議的格式
    2、Http常見請求頭
    3、Http的get請求
    4、Http的post請求
==========================================================================
1、Http請求協議的格式
    請求就是客戶端傳送給伺服器的資料!   客戶端 ----> 伺服器
    請求格式:
    ----------------------------------------------------------------------------------------------
    |   * 請求首行:請求方法 請求路徑 請求協議/版本。例如:GET /hello/index.jsp HTTP/1.1
    |   * 請求頭:請求頭就是一些鍵值,格式為:頭:值,例如:Host:localhost
    |   * 空行:就是一個空行,用來與請求體分隔
    |   * 請求體:GET方法沒有請求體,POST才有請求體,
    |       - 請求體內容為:引數名=引數值&引數名=引數值,其中引數值為中文,會使用URL編碼。
    -----------------------------------------------------------------------------------------------
        客戶端瀏覽器傳送給伺服器的內容就這個格式的,如果不是這個格式伺服器將無法解讀!在HTTP協議中,請求有
    很多請求方法,其中最為常用的就是GET和POST。不同的請求方法之間的區別,後面會一點一點的介紹。

2、Http常見請求頭
    * Host:請求的伺服器主機名
    * User-Agent:客戶端瀏覽器與作業系統相關資訊
    * Accept-Encoding:客戶端支援的資料壓縮格式
    * Connection:客戶端支援的連線方式
    * Cookie:客戶端傳送給伺服器的"小甜點",它伺服器寄存在客戶端的。如果當前訪問的伺服器沒有在客戶端寄存東西,
            那麼就不會存在它!
    * Content-Length:請求體的長度
    * Referer:當前發出請求的地址,例如在瀏覽器位址列直接訪問伺服器,那麼沒有這個請求頭。
            如果是在www.baidu.com頁面上點選連結訪問的伺服器,那麼這個頭的值就是www.baidu.com
        > 作用1:統計來源
        > 作用2:防盜鏈
    * Content-Type:如果是POST請求,會有這個頭,預設值為application/x-www-form-urlencoded,表示請求體
            內容使用url編碼。

3、Http的get請求
        開啟IE,在訪問hello專案的index.jsp之間開啟HttpWatch,並點選“Record”按鈕。然後訪問index.jsp頁面。
    檢視請求內容如下:
    --------------------- 請求資訊如下 -----------------------------------------------------------
    |    GET /hello/index.jsp HTTP/1.1
    |    Host: localhost
    |    User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
    |    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    |    Accept-Language: zh-cn,zh;q=0.5
    |    Accept-Encoding: gzip, deflate
    |    Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
    |    Connection: keep-alive
    |    Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98[請求頭,請求頭由key/value組成。]
    |               [這個位置是空行,雖然沒有東西,但很重要。如果有請求體,那麼請求體在空行的下面]
    --------------------- GET請求沒有請求體,結束 -------------------------------------------------
    請求資訊解釋:
      * GET /hello/index.jsp HTTP/1.1   --> GET請求,請求伺服器路徑為/hello/index.jsp,協議為HTTP的1.1版本
      * Host:localhost    --> 請求的主機名為localhost
      * User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0  -->與瀏覽器和OS
            相關的資訊。有些網站會顯示使用者的系統版本和瀏覽器版本資訊,這都是通過獲取User-Agent頭資訊而來的.
      * Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 --> 告訴伺服器,當前
            客戶端可以接收的文件型別,其實這裡包含了*/*,就表示什麼都可以接收;
      * Accept-Language: zh-cn,zh;q=0.5 -->當前客戶端支援的語言,可以在瀏覽器的工具選項中找到語言相關資訊;
      * Accept-Encoding: gzip, deflat -->支援的壓縮格式。資料在網路上傳遞時,可能伺服器會把資料壓縮後再發送;
      * Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7  --> 客戶端支援的編碼;
      * Connection: keep-alive  --> 客戶端支援的連結方式,保持一段時間連結,預設為3000ms;因為大型頁面上會有
            框架頁,會觸發很多相關的頁面請求,圖片等資源會單獨發請求,所以連線伺服器一會兒可保證頁面載入成功。
            保持連線一會兒,會在連線時間內完成頁面內容載入完全。
      * Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98    --> 因為不是第一次訪問這個地址,所以會在
            請求中把上一次伺服器響應中傳送過來的Cookie在請求中一併傳送去過;這個Cookie的名字為JSESSIONID,
            以後講的"會話"是講它!

4、Http的post請求
    為了演示POST請求,我們需要修改index.jsp頁面,即新增一個表單:
        <form action="" method="post">
            關鍵字:<input type="text" name="username"/>
            <input type="password" name="password"/>
            <input type="submit" value="提交"/>
        </form>
    POST請求是有請求體的,而GET請求不能有請求體。
    開啟HttpWatch,輸入hello後點擊提交,檢視請求內容如下:
    --------------------- 請求資訊如下 ---------------------------------------------------------
    |    POST /hello/index.jsp HTTP/1.1          [描述:請求首行]
    |    Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword,
    |        application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application,
    |        application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
    |    Referer: http://localhost:8080/hello/index.jsp
    |    Accept-Language: zh-cn,en-US;q=0.5
    |    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2;
    |         .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
    |    Content-Type: application/x-www-form-urlencoded
    |    Accept-Encoding: gzip, deflate
    |    Host: localhost:8080
    |    Content-Length: 13
    |    Connection: Keep-Alive
    |    Cache-Control: no-cache
    |    Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D|
    |                                                   [描述:這是空行。]
    |    username=zhangsan&password=123           [描述:這是請求體,上面是空行。]
    --------------------- POST 請求有請求體-------------------------------------------------
    請求資訊解釋:
        Content-Type: application/x-www-form-urlencoded --> 表單的資料型別,說明會使用url格式編碼資料;
        Content-Length:13  --> 請求體的長度,這裡表示13個位元組。
        username=zhangsan&password=123  --> 請求體內容!username 是表單欄位的名字,
            zhangsan 是在表單中輸入的資料,不同欄位的資料用"&"符號連線。
    詳解Referer:
        Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈。
            * 統計工作:我公司網站在百度上做了廣告,但不知道在百度上做廣告對我們網站的訪問量是否有影響,
                那麼可以對每個請求中的Referer進行分析,如果Referer為百度的很多,那麼說明使用者都是通過百度
                找到我們公司網站的。
            * 防盜鏈:我公司網站上有一個下載連結,而其他網站盜鏈了這個地址,
                例如在我網站上的index.html頁面中有一個連結,點選即可下載JDK7.0,但有某個人的微博中盜鏈了
                這個資源,它也有一個連結指向我們網站的JDK7.0,也就是說登入它的微博,點選連結就可以從我網站
                上下載JDK7.0,這導致我們網站的廣告沒有看,但下載的卻是我網站的資源。這時我們可以使用Referer
                進行防盜鏈,在資源被下載之前,我們對Referer進行判斷,如果請求來自本網站,那麼允許下載;
                如果非本網站,先跳轉到本網站看廣告,然後再允許下載。
------