HTTP協議簡介

HTTP(Hyper Text Transfer Protocol):超文本傳輸協議的縮寫。它是萬維網(World Wide Web, www, 也簡稱爲Web)的基礎。用於Web瀏覽器、服務器和相關的 Web 應用程序之間的相互通信。

HTTP 是一個應用層協議,由請求和響應組成。HTTP 把聯網的細節都交給了通用、可靠的傳輸控制協議 TCP,因此,它能夠確保數據在傳輸過程中不會被損壞或產生混亂,用戶在訪問信息時不用擔心其完整性。

媒體類型

互聯網上有數千種不同的數據類型,HTTP 給每種要通過 Web傳輸的對象都打上名爲 MIME 類型(MIME type)的數據格式標籤。當 Web瀏覽器從服務器中取回一個對象時,會去查看相關的 MIME類型,看看它是否知道應該如何處理該對象。

        wKiom1SfZl2B32-pAACJ1raG5RA996.jpg

MIME 類型是一種文本標記,表示一種主要的對象類型和一個特定的子類型,中間由一條斜槓來分隔。

    HTML格式的文本文檔由 text/html 類型標記

    普通的 ASCII文本文檔由 text/plain 類型標記

    JPEG 版本的圖片爲 p_w_picpath/jpeg 類型

    GIF 格式的圖片爲 p_w_picpath/gif 類型

URI

每個 Web服務器資源都有一個名字,稱爲統一資源標識符(Uniform Resource Identifier, URI),在世界範圍內唯一標識並定位信息資源。URI有兩種形式:URL 和 URN。

URL 統一資源定位符

資源標識符最常見的形式。它們可以明確說明如何從一個精確、固定的位置獲取資源。下圖顯示了 URL 如何精確的說明某資源的位置以及如何去訪問它。

       

wKioL1SflEqzyusuAADaA2rwEFs544.jpg

大部分 URL都遵循一種標準格式,這種格式包含三部分。

    第一部分被稱爲 方案(scheme),說明了訪問資源所使用的協議類型;

    第二部分給出了服務器的互聯網地址;

    其餘部分指定了 Web服務器上的某個資源

事務

一個 HTTP事務由一條 請求(request)命令和一條響應(response)結果組成。這種通信是通過名爲 HTTP報文(HTTP message)格式化數據塊進行的。


wKioL1SflkqTIX3tAAD_DapTc1Q854.jpg

HTTP支持幾種不同的請求命令,這些命令被稱爲 HTTP方法(HTTP method)。每條 HTTP請求報文都包含一個方法。該方法會告訴服務器要執行什麼動作。


wKioL1Sfl1jRX6PhAACwy3oxjQs264.jpg

每條 HTTP響應報文返回時都會攜帶一個狀態碼。狀態碼是一個三位數字的代碼,告知客戶端請求是否成功,或者是否需要採取其他動作。


wKiom1Sfl6qCzLwPAABmbeEbVhQ097.jpg

伴隨着每個數字狀態碼,HTTP還會發送一條解釋性的“原因短語”文本文本短語主要爲了進行描述。

HTTP報文

HTTP報文都是純文本,不是二進制代碼。HTTP報文是在HTTP應用程序之間發送的數據塊。數據塊以一些文本形式的元信息(meta-information)開頭,這些信息描述了報文的內容及含義,後面跟可選的數據部分。術語“流入”“流出”“上游”及“下游”都是用來描述報文方向的。

HTTP使用術語流入(inbound)和流出(outbound)來描述事務處理(transaction)的方向。不管是請求報文還是響應報文,所有報文都會向下游(downstream)流動。

報文的組成部分

報文由3個部分組成:對報文進行描述的起始行(start line)、包含屬性的首部(header)塊,以及可選的、包含數據的主體(body)部分。示例  起始行和首部就是由行分隔的ASCII文本。實體的主體或報文的主體(或稱爲主體)是一個可選的數據塊。與起始行和首部不同的是,主體中可以包含文本或二進制數據,也可以爲空。

報文的語法

所有的HTTP報文都可以分爲兩類:請求報文(request message)和響應報文(response message)。請求報文和響應報文的基本報文結構相同。

wKiom1SeOcCRZ1gQAAEKSXGRNdM865.jpg

請求報文的格式:

wKiom1SeOuOB3wX4AAA4mli8kVQ749.jpg

響應報文的格式:(只有起始行的語法不同)

wKiom1SeO0jwnK-WAAA2UyfJt0k910.jpg

對各部分的簡要描述:

    方法(method)

    客戶端希望服務器對資源執行的動作。是一個單獨的詞,比如GET、HEAD 或 POST。

    請求URL(request-URL)

    命名了所請求資源,或者URL路徑組件的完整URL。

    版本(version)

    報文所使用的 HTTP 版本

    狀態碼(status-code)

    這三位數字描述了請求過程中所發生的情況。每個狀態碼的第一位數字都用於描述狀態的一般類別(“成功”、“出錯”等)。

    原因短語(reason-phrase)

    數字狀態碼的可讀版本,包含行終止序列之前的所有文本。

    首部(header)

    可以有零個或多個首部。每個首部都包含一個名字,後跟一個冒號(:),一個可選的空格,和一個值。

    實體的主體部分(entity-body)

    主體部分包含一個由任意數據組成的數據塊。並不是所有的報文都包含實體的主體部分。

請求和響應報文示例

    wKioL1SeQQexUYozAACwiAWdDHc505.jpg

起始行

所有的 HTTP 報文都以一個起始行作爲開始。請求報文的起始行說明了要做些什麼,響應報文的起始行說明發生了什麼

請求的起始行以方法作爲開始,方法用於告訴服務器要做些什麼。

常用的 HTTP 方法

    wKiom1SeRkWwvZlkAADtRncAeYc236.jpg

狀態碼:用於告訴客戶端,發生了什麼事情。可以通過三位數字代碼對不同狀態碼進行分類。200到299之間的狀態碼錶示成功。300到399之間的狀態碼錶示資源已被移走。400到499之間的狀態碼錶示客戶端的請求出錯了。500到599之間的狀態碼錶示服務器出錯了。

    狀態碼分類

        wKioL1SeSNOzT9jGAACGc982aGM799.jpg

    常見狀態碼

        wKioL1SeSZTBQ1gXAACTpR91IB4920.jpg

原因短語:爲狀態碼提供了文本形式的解釋。和狀態碼成對出現。

首部:跟在起始行後面的就是零、一個或多個 HTTP 首部字段。

首部分類:HTTP 規範定義了幾種首部字段。可以分爲以下幾類:

    通用首部:既可以出現在請求報文中,也可以出現在響應報文中。

    請求首部:提供更多有關請求的信息。

    響應首部:提供更多有關響應的信息。

    實體首部:描述主體的長度和內容,或者資源自身。

    擴展首部:規範中無定義的新首部。

常見的首部實體

      wKioL1SeTGbScvcnAADOC2qTCSE866.jpg

實體的主體部分

HTTP 報文的第三部分是可選的實體主體部分。實體的主體是 HTTP 報文的負荷。

方法

GET:最常用的方法。通常用於請求服務器發送某個資源。

        wKioL1Sec-nwvGo1AAC3B_wsXaU332.jpg

HEAD:與GET方法的行爲很類似,但服務器在響應中只返回首部。不會返回實體的主體部分。這允許客戶端在未獲取實際資源的情況下,對資源的首部進行檢查。該請求通常被用來測試超文本鏈接的正確性、可訪問性和最近的修改。 使用 HEAD,可以:

    1、在不獲取資源的情況下了解資源的情況(比如 判斷其類型);

    2、通過查看響應中的狀態碼,看看某個對象是否存在;

    3、通過查看首部,測試資源是否被修改

下圖顯示了實際的 HEAD 方法

      wKiom1SediHyclNGAACxEoL8e0o465.jpg

PUT:與 GET 從服務器讀取文檔相反,PUT 方法會向服務器寫入文檔。

      wKiom1SedyjBY8QvAAESyxwUQQk917.jpg

PUT方法的語義就是讓服務器用請求的主體部分來創建一個由所請求的 URL 命名的新文檔,如果那個 URL 已經存在的話,就用這個主體來替換它。

POST:用於向服務器發送數據。通常會用它來支持 HTML 表單。表單中填好的數據通常會被送給服務器,然後由服務器將其發送到它要去的地方(比如,送到一個服務器網關程序中,然後由這個程序對其進行處理)。這是唯一需要在請求中發送body的請求。 下圖顯示了一個用 POST 方法發起 HTTP 請求——向服務器發送表單數據——客戶端。

      wKioL1Seezmi2cYDAAFuKXfqoX0070.jpg

TRACE:客戶端發起一個請求時,這個請求可能要穿過防火牆、代理、網關或其他一些應用程序。每個中間節點都可能會修改原始的 HTTP 請求。TRACE 方法允許客戶端在最終將請求發送給服務器時,看看它變成了什麼樣子。

OPTIONS:該方法請求 Web 服務器告知其支持的各種功能。可以詢問服務器通常支持哪些方法,或者對某些特殊資源支持哪些方法。這爲客戶端應用程序提供了一種手段,使其不用實際訪問那些資源就能判定訪問各種資源的最優方式。下圖顯示了一個使用 OPTIONS 方法的請求。

        wKiom1SehX7zK_xCAADPigVnvf4448.jpg

DELETE:該方法所做的事情就是請服務器刪除請求 URL 所指定的資源。但客戶端應用程序無法保證刪除操作一定會被執行。因爲 HTTP 規範允許服務器在不通知客戶端的情況下撤銷請求。下圖顯示了一個 DELETE 方法示例。

        wKioL1Seh5CQ08daAADoP8tp8Zg391.jpg

擴展方法:指的就是沒有在 HTTP/1.1 規範中定義的方法。下圖顯示 Web 發佈擴展方法示例。

        wKiom1Seh8bC2ezIAACq6cAJvQ8166.jpg

狀態碼

狀態碼爲客戶端提供了一種理解事務處理結果的便捷方式。

待續。。。


 











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章