作者:developerHaoz
Github 地址:developerHaoz
說明:本文主要是對 HTTP 基礎知識進行總結和歸納,畢竟做 IT 的,網路這一塊還是很重要的
本文的主要內容
- HTTP 是什麼
- URL 詳解
- HTTP 之請求篇
- HTTP 之響應篇
一、HTTP是什麼
1、概述
HTTP 全稱是 HyperText Transfer Protocal
,即:超文字傳輸協議,從 1990 年開始就在 WWW 上廣泛應用,是現今在 WWW 上應用最多的協議,HTTP 是應用層協議,當你上網瀏覽網頁的時候,瀏覽器和 web 伺服器之間就會通過 HTTP 在 Internet 上進行資料的傳送和接收。HTTP 是一個基於請求/響應模式的、無狀態的協議。即我們通常所說的 Request/Response
2、特點
- 支援客戶端/伺服器模式
- 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。由於 HTTP 協議簡單,使得 HTTP 伺服器的程式規模小,因而通訊速度很快
- 靈活:HTTP 允許傳輸任意型別的資料物件。正在傳輸的型別由 Content-Type 加以標記
- 無連線:無連線的含義是限制每次連結只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連結,採用這種方式可以節省傳輸時間
- 無狀態:HTTP 協議是無狀態協議。無狀態是指協議對於事物處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能會導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就比較快
二、URL詳解
1、簡介
URL(Uniform Resource Locator)是統一資源定位符的簡稱,有時候也被俗稱為網頁地址(網址),如同是網路上的門牌,是因特網上標準的資源的地址
2、基本組成
通用的格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
名稱 | 功能 |
---|---|
scheme | 訪問伺服器以獲取資源時要使用哪種協議,比如,http,https 和 FTP 等 |
host | HTTP 伺服器的 IP 地址或域名 |
port# | HTTP 伺服器的預設埠是 80,這種情況下埠號可以省略,如果使用了別的埠,必須指明,例如www.cnblogs.com:8080 |
path | 訪問資源的路徑 |
query-string | 發給 http 伺服器的資料 |
anchor | 錨 |
舉個例子:
www.mywebsite.com/sj/test/tes…
其中
名稱 | 對應的欄位 |
---|---|
Schema | http |
host | www.mywebsite.com |
path | /js/test/test.aspx |
Query-string | name=sviergn&x=true |
anchor | stuff |
再來張比較直觀的圖
三、HTTP 之請求篇
HTTP 的請求報文分為三個部分:請求行、請求頭、請求體
1、請求行
請求行(Request line)分為三個部分:請求方法、請求地址和協議版本
請求方法
HTTP/1.1 協議中共定義了八種方法(也叫“動作”)來以不同的方式操作指定的資源
方法名 | 功能 |
---|---|
GET | 向指定的資源發出“顯示”請求,使用 GET 方法應該只用在讀取資料上,而不應該用於產生“副作用”的操作中 |
POST | 指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求文字中。這個請求可能會建立新的資源或者修改現有資源,或兩者皆有。 |
PUT | 向指定資源位置上傳其最新內容 |
DELETE | 請求伺服器刪除 Request-URI 所標識的資源 |
OPTIONS | 使伺服器傳回該資源所支援的所有HTTP請求方法。用* 來代替資源名稱,向 Web 伺服器傳送 OPTIONS 請求,可以測試伺服器功能是否正常運作 |
HEAD | 與 GET 方法一樣,都是向伺服器發出指定資源的請求,只不過伺服器將不傳回資源的本文部分,它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以獲取其中關於該資源的資訊 (原資訊或稱後設資料) |
TRACE | 顯示伺服器收到的請求,主要用於測試或診斷 |
CONNECT | HTTP/1.1 中預留給能夠將連線改為通道方式的代理伺服器。通常用於 SSL 加密伺服器的連結(經由非加密的 HTTP 代理伺服器) |
其中,最常見的是 GET 和 POST 方法,如果是 RESful 介面的話一般會用到 PUT、DELETE、GET、POST(分別對應增刪查改),這裡附上一篇有關 REST 的文章 什麼是 REST
2、請求頭
請求頭可用於傳遞一些附加資訊,格式為:鍵: 值
,注意冒號後面有一個空格:
請求和響應常見通用的 Header
名稱 | 作用 |
---|---|
Content-Type | 請求體/響應體的型別,如:text/plain、application/json |
Accept | 說明接收的型別,可以多個值,用, (英文逗號)分開 |
Content-length | 請求體/響應體的長度,單位位元組 |
Content-Encoding | 請求體/響應體的編碼格式,如 gzip、deflate |
Accept-Encoding | 告知對方我方接受的 Content-Encoding |
ETag | 給當前資源的標識,和Last-Modified 、If-None-Match 、If-Modified-Since 配合,用於快取控制 |
Cache-Control | 取值一般為no-cache 、max-age=xx ,xx為整數,表示資源快取有效期(秒) |
常見的請求 Header
名稱 | 作用 |
---|---|
Authorization | 用於設定身份認證資訊 |
User-Agent | 使用者標識,如:OS 和瀏覽器的型別和版本 |
If-Modified-Since | 值為上一次伺服器返回的Last-Modified 值,用於確定某個資源是否被更改過,沒有更改過就從快取中讀取 |
If-None-Match | 值為上一次伺服器返回的 ETag 值,一般會和If-Modified-Since |
Cookie | 已有的Cookie |
Referer | 標識請求引用自哪個地址,比如你從頁面 A 跳轉到頁面 B 時,值為頁面 A 的地址 |
Host | 請求的主機和埠號 |
請求體
請求體(又叫請求正文)是 post 請求方式中的請求引數,以 key = value 形式進行儲存,多個請求引數之間用&連線,如果請求當中請求體,那麼在請求頭當中的 Content-Length 屬性記錄的就是該請求體的長度
根據應用場景的不同,HTTP 請求的請求體有三種不同的形式
第一種:
移動開發者常見的,請求體是任意型別的,伺服器不會解析請求體,請求體的處理需要自己解析,如 POST JSON 的時候就是這類
第二種:
第二種和第三種都有固定的格式,是伺服器端開發人員最先了解的兩種。這裡的格式要求就是 URL 中 Query String 的格式要求:多個鍵值對之間用&
連線,鍵與值之間用=
連線,且只能用 ASCII 字元,非 ASCII 字元需使用UrlEncode
編碼
第三種:
第三種請求體被分成多個部分,檔案上傳 時會被使用,這種格式最先是被用於郵件傳輸中,每個欄位/檔案都被 boundary(Content-Type中指定的)分成單獨的段,每段以--
加 boundary 開頭,然後是該段的描述頭,描述頭之後空一行接內容,請求結束的標識為 boundary 後面加--
區分是否被當成檔案的關鍵是 Content-Disposition
是否包含 filename
,因為檔案有不同的型別,所以還要使用 Content-Type
指示檔案的型別,如果不知道是什麼型別取值可以為 application/octet-stream
表示檔案是一個二進位制的檔案,如果不是檔案則 Content-Type
可以省略
四、HTTP 之響應篇
HTTP 響應的格式上除狀態行(第一行)與請求報文的請求行不一樣之外,其他的就格式而言是一樣的,但排除狀態行和請求行的區別,從 Header 上還是可以區分出 HTTP 請求和 HTTP 響應的區別的,怎麼區別就要看前面的 Header 啦
1、響應狀態行
狀態碼
狀態碼(就是上圖中的響應碼),如果想檢視各種狀態碼具體的含義,可以看一下這篇文章HTTP狀態碼對照表,當然這麼多狀態碼要想全部都記住的話,還是比較困難的。
在平時我們只要記住這些就差不多了
狀態碼 | 對應的資訊 |
---|---|
1XX | 提示資訊—表示請求已接收,繼續處理 |
2XX | 用於表示請求已被成功接收、理解、接收 |
3XX | 用於表示資源(網頁等)被永久轉移到其它 URL,也就是所謂的重定向 |
4XX | 客戶端錯誤—請求有語法錯誤或者請求無法實現 |
5XX | 伺服器端錯誤—伺服器未能實現合法的請求 |
2、響應頭
響應頭同樣可用於傳遞一些附加資訊
常見的響應 Header
名稱 | 作用 |
---|---|
Date | 伺服器的日期 |
Last-Modified | 該資源最後被修改的時間 |
Transfer-Encoding | 取值一般為 chunked,出現在 Content-Length 不能確定的情況下,表示伺服器不知道響應板體的資料大小,一般同時出現Content-Encoding 響應頭 |
Set-Cookie | 設定 Cookie |
Location | 重定向到另一個 URL,如輸入瀏覽器就輸入 baidu.com 回車,會自動跳轉到www.baidu.com 就是通過這個響應頭控制的 |
Server | 後臺伺服器 |
3、響應體
響應體也就是網頁的正文內容,一般在響應頭中會用 Content-Length 來明確響應體的長度,便於瀏覽器接收,對於大資料量的正文資訊,也會使用 chunked 的編碼方式。