HTTP(Hyper Text Transfer Protocol):超文本傳輸協議的縮寫。它是萬維網(World Wide Web, www, 也簡稱爲Web)的基礎。用於Web瀏覽器、服務器和相關的 Web 應用程序之間的相互通信。
HTTP 是一個應用層協議,由請求和響應組成。HTTP 把聯網的細節都交給了通用、可靠的傳輸控制協議 TCP,因此,它能夠確保數據在傳輸過程中不會被損壞或產生混亂,用戶在訪問信息時不用擔心其完整性。
媒體類型
互聯網上有數千種不同的數據類型,HTTP 給每種要通過 Web傳輸的對象都打上名爲 MIME 類型(MIME type)的數據格式標籤。當 Web瀏覽器從服務器中取回一個對象時,會去查看相關的 MIME類型,看看它是否知道應該如何處理該對象。
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 如何精確的說明某資源的位置以及如何去訪問它。
大部分 URL都遵循一種標準格式,這種格式包含三部分。
第一部分被稱爲 方案(scheme),說明了訪問資源所使用的協議類型;
第二部分給出了服務器的互聯網地址;
其餘部分指定了 Web服務器上的某個資源
事務
一個 HTTP事務由一條 請求(request)命令和一條響應(response)結果組成。這種通信是通過名爲 HTTP報文(HTTP message)格式化數據塊進行的。
HTTP支持幾種不同的請求命令,這些命令被稱爲 HTTP方法(HTTP method)。每條 HTTP請求報文都包含一個方法。該方法會告訴服務器要執行什麼動作。
每條 HTTP響應報文返回時都會攜帶一個狀態碼。狀態碼是一個三位數字的代碼,告知客戶端請求是否成功,或者是否需要採取其他動作。
伴隨着每個數字狀態碼,HTTP還會發送一條解釋性的“原因短語”文本。文本短語主要爲了進行描述。
HTTP報文
HTTP報文都是純文本,不是二進制代碼。HTTP報文是在HTTP應用程序之間發送的數據塊。數據塊以一些文本形式的元信息(meta-information)開頭,這些信息描述了報文的內容及含義,後面跟可選的數據部分。術語“流入”“流出”“上游”及“下游”都是用來描述報文方向的。
HTTP使用術語流入(inbound)和流出(outbound)來描述事務處理(transaction)的方向。不管是請求報文還是響應報文,所有報文都會向下游(downstream)流動。
報文的組成部分
報文由3個部分組成:對報文進行描述的起始行(start line)、包含屬性的首部(header)塊,以及可選的、包含數據的主體(body)部分。示例 起始行和首部就是由行分隔的ASCII文本。實體的主體或報文的主體(或稱爲主體)是一個可選的數據塊。與起始行和首部不同的是,主體中可以包含文本或二進制數據,也可以爲空。
報文的語法
所有的HTTP報文都可以分爲兩類:請求報文(request message)和響應報文(response message)。請求報文和響應報文的基本報文結構相同。
請求報文的格式:
響應報文的格式:(只有起始行的語法不同)
對各部分的簡要描述:
方法(method)
客戶端希望服務器對資源執行的動作。是一個單獨的詞,比如GET、HEAD 或 POST。
請求URL(request-URL)
命名了所請求資源,或者URL路徑組件的完整URL。
版本(version)
報文所使用的 HTTP 版本
狀態碼(status-code)
這三位數字描述了請求過程中所發生的情況。每個狀態碼的第一位數字都用於描述狀態的一般類別(“成功”、“出錯”等)。
原因短語(reason-phrase)
數字狀態碼的可讀版本,包含行終止序列之前的所有文本。
首部(header)
可以有零個或多個首部。每個首部都包含一個名字,後跟一個冒號(:),一個可選的空格,和一個值。
實體的主體部分(entity-body)
主體部分包含一個由任意數據組成的數據塊。並不是所有的報文都包含實體的主體部分。
請求和響應報文示例
起始行
所有的 HTTP 報文都以一個起始行作爲開始。請求報文的起始行說明了要做些什麼,響應報文的起始行說明發生了什麼。
請求的起始行以方法作爲開始,方法用於告訴服務器要做些什麼。
常用的 HTTP 方法
狀態碼:用於告訴客戶端,發生了什麼事情。可以通過三位數字代碼對不同狀態碼進行分類。200到299之間的狀態碼錶示成功。300到399之間的狀態碼錶示資源已被移走。400到499之間的狀態碼錶示客戶端的請求出錯了。500到599之間的狀態碼錶示服務器出錯了。
狀態碼分類
常見狀態碼
原因短語:爲狀態碼提供了文本形式的解釋。和狀態碼成對出現。
首部:跟在起始行後面的就是零、一個或多個 HTTP 首部字段。
首部分類:HTTP 規範定義了幾種首部字段。可以分爲以下幾類:
通用首部:既可以出現在請求報文中,也可以出現在響應報文中。
請求首部:提供更多有關請求的信息。
響應首部:提供更多有關響應的信息。
實體首部:描述主體的長度和內容,或者資源自身。
擴展首部:規範中無定義的新首部。
常見的首部實體
實體的主體部分
HTTP 報文的第三部分是可選的實體主體部分。實體的主體是 HTTP 報文的負荷。
方法
GET:最常用的方法。通常用於請求服務器發送某個資源。
HEAD:與GET方法的行爲很類似,但服務器在響應中只返回首部。不會返回實體的主體部分。這允許客戶端在未獲取實際資源的情況下,對資源的首部進行檢查。該請求通常被用來測試超文本鏈接的正確性、可訪問性和最近的修改。 使用 HEAD,可以:
1、在不獲取資源的情況下了解資源的情況(比如 判斷其類型);
2、通過查看響應中的狀態碼,看看某個對象是否存在;
3、通過查看首部,測試資源是否被修改
下圖顯示了實際的 HEAD 方法
PUT:與 GET 從服務器讀取文檔相反,PUT 方法會向服務器寫入文檔。
PUT方法的語義就是讓服務器用請求的主體部分來創建一個由所請求的 URL 命名的新文檔,如果那個 URL 已經存在的話,就用這個主體來替換它。
POST:用於向服務器發送數據。通常會用它來支持 HTML 表單。表單中填好的數據通常會被送給服務器,然後由服務器將其發送到它要去的地方(比如,送到一個服務器網關程序中,然後由這個程序對其進行處理)。這是唯一需要在請求中發送body的請求。 下圖顯示了一個用 POST 方法發起 HTTP 請求——向服務器發送表單數據——客戶端。
TRACE:客戶端發起一個請求時,這個請求可能要穿過防火牆、代理、網關或其他一些應用程序。每個中間節點都可能會修改原始的 HTTP 請求。TRACE 方法允許客戶端在最終將請求發送給服務器時,看看它變成了什麼樣子。
OPTIONS:該方法請求 Web 服務器告知其支持的各種功能。可以詢問服務器通常支持哪些方法,或者對某些特殊資源支持哪些方法。這爲客戶端應用程序提供了一種手段,使其不用實際訪問那些資源就能判定訪問各種資源的最優方式。下圖顯示了一個使用 OPTIONS 方法的請求。
DELETE:該方法所做的事情就是請服務器刪除請求 URL 所指定的資源。但客戶端應用程序無法保證刪除操作一定會被執行。因爲 HTTP 規範允許服務器在不通知客戶端的情況下撤銷請求。下圖顯示了一個 DELETE 方法示例。
擴展方法:指的就是沒有在 HTTP/1.1 規範中定義的方法。下圖顯示 Web 發佈擴展方法示例。
狀態碼:
狀態碼爲客戶端提供了一種理解事務處理結果的便捷方式。
待續。。。