HTTP

HTTP

HTTP 全名為 Hyper Text Transfer Protocol 超文字傳輸協定

紀錄於 RFC 2616

以及衍生的 HTTPS、HTTP/2 等協定

相信各位在計算機網路概論都有學習過該協定的內容, 因此這裡只會進行一些補充

以及一些伺服器相關的實作

請注意, 如 HTTP Pipeline 之類的細節不在本章範疇, 預設你已經在計算機網路概論學習過了

User-agent

泛指能夠發出請求的工具, 通常由瀏覽器協助處理。而一些情況下, 如開發人員的Debugger、爬蟲腳本等, 也算是 User-agent

由瀏覽器發出的請求, 通常會受到一些限制(不像自己撰寫的Request 那麼自由), 常見的工具有

  • curl
  • wget
  • python、javascript、php 的腳本

那在 linux 系統上, 還有如 nc 等工具, 可以建立 Raw TCP 連線, 輸入 HTTP 請求文:

netcat

HTTP 請求格式

Request

請求會由以下幾個元素組合而成:

  • HTTP 動詞
  • 請求路徑
  • HTTP 協議版本
  • headers
  • 請求內容

HTTP 的 Header 可以見 MDN: HTTP Headers

這裡只提幾個重要且常見的 Header:

  • Authorization:添加認證資訊
  • Content-type:告知接收方, 請求內容的格式
  • X-*:自定義的表頭

這裡特別要提及的是 Content-type, 在REST 章節中, 有強調資源的表達, 就是透過該表頭

比方說 JSON 格式的資料, 會透過 content-type: application/json

一般的表單提交, 通常會會是 application/x-www-form-urlencoded 或是 multioart/form-data

在以前, 比較少處理檔案的提交, 因此使用 application/x-www-form-urlencoded 即可, 他會把表單用類似 Query String 的方式封裝

如果有個表單要輸入:帳號、密碼、電子信箱, 那封裝後的資料格式為

account=myacc&password=a12345678&[email protected]

HTTP 回應格式

Response

響應內容會由以下幾個元素組合而成:

  • HTTP 協議版本號
  • status code, 告知對應請求的成功或失敗, 以及原因
  • status message, 描述訊息, 可以由伺服器端指定
  • HTTP headers(與請求相似)
  • 回應主體

Content-type 重要的原因為, 他指明了資源是以何種模式傳送, 即使今日我發明了某種特殊的格式 my-packed

只要伺服器端擷取 content-type 表頭, 就可以知道應該以什麼樣的方式來存取資源

比方說實現一個伺服器, 並把回傳表頭設定為 text/plain, 而不是 text/hmtl

這將會使得瀏覽器不把回傳內容當成 HTML 處理, 因此會顯示:

text-plain

而非平常看到的網頁形式

要注意的是, 在瀏覽器上看到的一切, 都是瀏覽器處理的

比方說HTML文字, 瀏覽器會繪製成精美的畫面;

使用 VSCode 打開, 舊只是一連串的文字;

請注意某些行為, 是由瀏覽器幫你完成的

HTTPS

在這裡, 要特別提及的事情是 HTTPS 為什麼要特別提呢?

原因是因為, HTTPS的站點與HTTP的站點瀏覽器的行為會不一樣

這是因為, HTTPS的站點瀏覽器會啟用 Secure Contexts

而一般的HTTP的站點, 會被限制某些 Web API, 比方說 麥克風或是PWA的功能

以 Google Meeting 的功能來說, 像是直播畫面、語音通話, 在HTTP站點是不可能的

Web API 中, 有某些特別的 APIs, 包含:

  • 需要用戶端設備的訪問權限
  • 針對特殊數據的訪問, 如用戶憑證

就不允許在 HTTP 站點中使用

在 MDN 的 API 說明中, 也會特別註記 secure-context

更多資訊參考 Secure Contexts

而有時候, 會感覺 HTTPS 的站點好像比較快

這也不是錯覺, 因為 HTTPS 部分可能會啟用 HTTP/2 或是 SPDY 協議, 因此不會限制併發數量

HTTP站點會限制同網域的最大併發數量, 請見這裡

不過當使用 localhost 時, 則不受到此限制, 因為是透過 loopback 位址(127.0.0.0/8 or ::1/128)進行處理

章節回顧

本章節把 HTTP 比較容易遺漏的部分看過一次, 並指出HTTPS站點的行為與HTTP站點是不同的

  • HTTP 的用戶端組成
  • Content-type 的重要性
  • 瀏覽器的 Secure Contexts