[翻譯]理解 HTTP 基礎

reggie發表於2021-07-16

之前刷阮一峰的部落格發現一篇很好的基礎文章,來翻譯下,鍛鍊下英文閱讀也不錯。

簡介

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 schoolsMDN 網站 上有更多關於它們的詳細介紹。

相關教程和資源

TCP/IP協議的初學者指南

使用Curl測試IOT應用

本作品採用《CC 協議》,轉載必須註明作者和本文連結
鐵甲依然在

相關文章