定義
HTTP 是一種用作獲取諸如 HTML 文件這類資源的協議。它是 Web 上進行任何資料交換的基礎,同時,也是一種客戶端—伺服器(client-server)協議,也就是說,請求是由接受方——通常是 Web 瀏覽器——發起的。完整網頁文件通常由文字、佈局描述、圖片、影片、指令碼等資源構成。
來自HTTP 概述 - HTTP | MDN (mozilla.org)
http 報文
分為請求與響應兩種型別
請求
一旦連線建立,使用者代理就可以傳送請求(使用者代理通常是 Web 瀏覽器,但也可以是其他的,例如爬蟲)。客戶端請求由一系列文字指令組成,並使用 CRLF 分隔(回車,然後是換行)
請求由以下元素組成:
- HTTP 方法,通常是由一個動詞,像
GET
、POST
等,或者一個名詞,像OPTIONS
、HEAD
等,來定義客戶端執行的動作。典型場景有:客戶端意圖獲取某個資源(使用GET
);傳送 HTML 表單的引數值(使用POST
);以及其他情況下需要的那些其他操作。 - 要獲取的那個資源的路徑——去除了當前上下文中顯而易見的資訊之後的 URL,比如說,它不包括協議(
http://
)、域名(這裡是developer.mozilla.org
),或是 TCP 的埠(這裡是80
)。 - HTTP 協議版本號。
- 為服務端表達其他資訊的可選標頭。
- 請求體(body),類似於響應中的請求體,一些像
POST
這樣的方法,請求體內包含需要了傳送的資源。
請求方法
HTTP 定義了一組請求方法用來指定對目標資源的行為。它們一般是名詞,但這些請求方法有時會被叫做 HTTP 動詞。最常用的請求方法是 GET
和 POST
:
GET
方法請求指定的資源。GET
請求應該只被用於獲取資料。POST
方法向伺服器傳送資料,因此會改變伺服器狀態。這個方法常在 HTML 表單中使用。
響應
當收到使用者代理傳送的請求後,Web 伺服器就會處理它,並最終送回一個響應。與客戶端請求很類似,伺服器響應由一系列文字指令組成,並使用 CRLF 分隔
響應報文包含了下面的元素:
- HTTP 協議版本號。
- 狀態碼,來指明對應請求已成功執行與否,以及不成功時相應的原因。
- 狀態資訊,這個資訊是一個不權威、簡短的狀態碼描述。
- HTTP 標頭,與請求標頭類似。
- 可選項,一個包含了被獲取資源的主體。
響應示例
成功的網頁響應:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 55743
Connection: keep-alive
Cache-Control: s-maxage=300, public, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:37:18 GMT
ETag: "2e77ad1dc6ab0b53a2996dfd4653c1c3"
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
Age: 7
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>A simple webpage</title>
</head>
<body>
<h1>Simple HTML webpage</h1>
<p>Hello, world!</p>
</body>
</html>
請求資源已被永久移動的網頁響應:
HTTP/1.1 301 Moved Permanently
Server: Apache/2.4.37 (Red Hat)
Content-Type: text/html; charset=utf-8
Date: Thu, 06 Dec 2018 17:33:08 GMT
Location: https://developer.mozilla.org/ (目標資源的新地址,伺服器期望使用者代理去訪問它)
Keep-Alive: timeout=15, max=98
Accept-Ranges: bytes
Via: Moz-Cache-zlb05
Connection: Keep-Alive
Content-Length: 325 (如果使用者代理無法轉到新地址,就顯示一個預設頁面)
<!DOCTYPE html>… (包含一個網站自定義頁面,幫助使用者找到丟失的資源)
請求資源不存在的網頁響應:
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=utf-8
Content-Length: 38217
Connection: keep-alive
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:35:13 GMT
Expires: Thu, 06 Dec 2018 17:35:13 GMT
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
X-Cache: Error from cloudfront
<!DOCTYPE html>… (包含一個站點自定義 404 頁面,幫助使用者找到丟失的資源)