之前刷阮一峰的部落格發現一篇很好的基礎文章,來翻譯下,鍛鍊下英文閱讀也不錯。
簡介
HTTP 代表超文字傳輸協議,用於跨網路傳輸資料。
它是 web 開發人員需要理解的一個關鍵協議,因為它被廣泛使用,也被用於物聯網應用程式中的資料和命令傳輸。
在協議的第一個版本只有一個方法,即 GET
,它將從伺服器請求一個頁面。而來自伺服器的響應總是一個HTML頁面 WiKi
為了讓你瞭解 HTTP 協議在開始時有多麼簡單,可以看一下只有1頁的 Original 規範。
從最初的 0.9版本 開始,至今已經有了好幾個版本的HTTP協議。
目前的版本是1.1,最近一次修訂是在2014年。 詳情請參閱 Wiki
HTTP協議如何工作
像大多數的協議一樣,HTTP是一個使用 客戶端=>伺服器
通訊模型的基於 命令 和 響應文字 的協議。
客戶端發出請求,伺服器進行響應。
HTTP協議也是一個無狀態協議,這表示伺服器不需要儲存會話資訊,並且每個請求對於其他請求而言都是獨立的。可以參見這個 wiki
這意味著:
- 所有的請求都是客戶端發起的(也就是你的瀏覽器發起)
- 伺服器對每個請求進行響應
- 請求(命令)和響應都是可讀的文字
- 請求之間是相互獨立的並且伺服器 不需要 去跟蹤請求
請求和響應的結構
請求和響應的訊息結構都是一樣的,如下所示
一個請求由 命令或者請求 + 可選的頭部 + 可選的正文內容 組成
一個響應由 狀態碼 + 可選的頭部 + 可選的正文內容 組成
使用簡單的 CRLF(回車和換行)組合來限定每一部分,並使用空白行來表示請求頭的結束。
如果請求或者響應包含了 訊息正文,則需要在請求頭明確指示出來。
請求中訊息正文的存在由請求頭中的欄位 Content-Length 或者 Transfer-Encoding 來表示。
請求訊息的結構是獨立於方法語義的,即使該方法未限定任何訊息正文的用途。參見 RFC 7230 第3.3節
注意:訊息正文後沒有CRLF(回車和換行),見 RFC 7230 第3.5節
HTTP請求
我們已經看到了一般的請求響應格式,現在我們來更詳細的瞭解他們。
第一行是強制性的必須要有,而且他的格式如下:
請求方法 + 資源路徑 + 協議版本
舉個例子:假設我們準備在 www.testsite5.com
上請求 testpage.htm
頁面。
請求的起始行將會是這樣:
GET /test.htm HTTP/1.1
- GET 是請求方法
- /testpage.htm 是資源的相對路徑
- HTTP/1.1 是我們使用的協議版本號
提示:
1.相對路徑不包含域名
2.瀏覽器使用我們輸入的URL來建立資源的相對URI
URI:統一資源標誌符,用於標識網際網路上的一個資源
URL:統一資源定位符,用來標識網際網路的一個資源,同時提供定位該資源的資訊。
一句話說:URL是URI的子集,他們都提供了資源是什麼,同時URL還提供瞭如何獲取資源。
瀏覽器不會顯示真實的HTTP請求,只有使用諸如Firefox下的 HTTP Header Live 之類的特殊工具才可以看到。
HTTP vs URL
大多數人們習慣在瀏覽器中輸入網址。通常看起來像這樣:
網址還會包含一個埠,不過一般情況下都被瀏覽器隱藏了(預設的80埠),不過呢你也可以手動給他加上,比如下面這樣的:
這將告訴Web瀏覽器要定位的資源的地址以及用於檢索該資源(http)的協議。
HTTP是傳輸協議,用來從伺服器傳輸資源(網頁,圖片,視訊等等)到客戶端
HTTP響應和響應碼
每個請求都會有一個響應。響應由如下組成:
- 狀態碼 和 描述
- 一個或多個可選的響應頭引數
- 多行的可選訊息正文,可以包括二進位制資料
狀態碼被分成了5組,每組都有他們的意義和一個 3位數 的程式碼。
- 1xx - 資訊響應
- 2xx - 成功響應
- 3xx - 多項選擇(重定向)
- 4xx - 客戶端響應
- 5xx - 服務端響應
舉個例子:一個成功的網頁請求會返回響應碼 200,而一個不成功的請求會返回響應碼 400。
完整的響應碼列表和他們的意義 這裡
中文參見:MDN_HTTP_STATUS
請求響應示例
我們請求一個簡單的網頁(testpage.htm),來檢查下他們的請求和響應。
下面是我輸入在瀏覽器中的地址:
下面是瀏覽器展示出來的響應
這裡是在輸入網址後 HTTP 請求-響應 的截圖
提醒:瀏覽器會自動的新增上 請求和響應 的 頭資訊。
在上面的例子中,請求是沒有正文內容的。應答中的正文內容是一個網頁,已經顯示在瀏覽器中。
請求型別
目前為止我們還沒有提到請求型別,但是在我們的例子中,我們已經見過了 GET 請求型別。
GET請求型別或方法用於從Web伺服器請求資源。
GET是最常用的請求型別,並且是原始 HTTP規範 中唯一的請求型別。
請求型別,方法,動作
HTTP協議現在支援8種請求型別,在文件中也被叫做是方法 或者 動作,他們是:
- GET - 從伺服器請求資源
- POST - 向伺服器提交資源(比如上傳檔案)
- PUT - 像POST一樣,但是用來替換資源
- DELETE - 從伺服器上刪除資源
- HEAD - 像GET一樣,但是隻返回請求頭,沒有正文
- OPTIONS - 獲取資源的選項(一般用來作為預檢請求)
- PATCH - 修改資源
- TRACE - 執行訊息迴環(請求接受者原樣返回他接受到的訊息)
關於Trace方法我自己沒有理解 不知道具體啥用,感覺是用來檢測中間環節是否有修改請求的地方
在今天的網際網路上,GET和POST是使用最多的方法。
其他的一些方法一般用在相關的Web和IOT APIs(物聯網) 上。
在 w3 schools 和 MDN 網站 上有更多關於它們的詳細介紹。
相關教程和資源
本作品採用《CC 協議》,轉載必須註明作者和本文連結