Logo
後端:邏輯、資料與服務架構

HTTP:用戶端和伺服器講話的共同語言

上一課認識了用戶端(Client)發需求、伺服器(Server)提供服務,但兩台素未謀面的機器要怎麼聽懂彼此?靠的是一套全世界都遵守的溝通規則:HTTP。 它的形式永遠是一問一答:用戶端送出一個 請求(Request:我要什麼),伺服器回一個 回應(Response:結果在這),一來一回就是一次對話。 你手腕上的手錶查天氣,走的也是同一套規則。按下面手錶上的「重新整理」,盯著右邊的圖:請求送過去、伺服器查好資料、回應送回來,錶面溫度才換新。
台北市9:41

24°

多雲時晴

最高 27° · 最低 19°

手錶Client

請求 Request →

← 回應 Response

氣象伺服器Server

 

請求:我要什麼

GET api.weather.com/taipei

白話:「給我台北現在的天氣」。GET 是「跟你要資料」的意思。

回應:結果在這

200 OK { "溫度": 24, "天氣": "多雲時晴" }……(還沒回來)

白話:「成功(200),資料附在後面」。錶面就是拿這包資料換上新溫度。

為什麼需要 HTTP?想像沒有規則的世界

剛剛那趟一問一答之所以順,是因為雙方都照規則講話。少了規則會怎樣?下面這個宇宙裡沒有 HTTP,伺服器想怎麼回就怎麼回:同一句「台北現在的天氣?」,一次回 ASCII 圖、一次回文言文、一次回俄文。 而你的手錶是程式,不會翻譯也不會推理,它只會做一件事:去回應裡找「溫度」欄位。每則回應下面那行小字就是它的拆解結果:找不到,只好把整段原文原樣貼上錶面,誰也看不懂現在到底幾度。先連按幾次「問天氣」感受一下。 打開下面的「HTTP 共同規則」開關就不一樣了:雙方講好之後,回應一律是同一種固定格式(200 OK + JSON):內容可以換、外框永遠一樣,「溫度」永遠待在講好的欄位裡,手錶一拆就中,錶面立刻換上正確的溫度。

HTTP 共同規則

還沒講好規則,伺服器想怎麼回就怎麼回

台北市9:41

--°

等天氣資料中…

氣象伺服器沒有共同規則

還沒開始問,按下面的「問天氣」。

台北現在的天氣?

拆開來看:一次請求、一次回應各裝了什麼

知道 HTTP 是一問一答之後,來看這一問一答裡各自裝了什麼。請求大致是「用什麼方法、找哪個網址、附帶什麼說明」,回應則是「成不成功、資料是什麼格式、東西在這」。 下面把兩邊的部件列出來,點一個就對到手錶查天氣那趟真實對話的哪一行。
請求Request

手錶寄出去的那一面

回應Response

伺服器回給你的那一面

手錶查台北天氣,真的送出與收到的長這樣
raw http request你寄出去的那一面
GET /taipei HTTP/1.1
Host: api.weather.com
Accept: application/json
(GET 只是要資料,沒有內文)
raw http response伺服器回給你的那一面
HTTP/1.1 200 OK
Content-Type: application/json
{ "溫度": 24, "天氣": "多雲" }

標頭與內文:包裹外的標籤,箱子裡的貨

剛剛拆出來的部件裡,標頭(Headers)和內文(Body)最容易搞混,用一件宅配包裹就分得很清楚: 標頭是貼在箱子外的說明單(給誰、什麼格式、多大),內文才是箱子裡真正的貨。 點標籤上任一欄看它在說什麼,再按「拆箱」看裡面裝了什麼。
內文 BODY箱子裡的貨物
{ "溫度": 24, "天氣": "多雲" }

手錶要的溫度,就是這包貨。

標頭 HEADERS關於這包的說明
白話

Content-Type: application/json

裡面的貨是 application/json:JSON 格式的資料。手錶看到這行,才知道要用拆 JSON 的方式拆這包。

標頭Headers箱子外的說明單

關於這包的資訊:什麼格式、多大、何時寄、能放多久。是「說明」,不是貨物本身。

內文Body箱子裡的貨物

你真正要的資料本體。錶面就是拆開這包、拿裡面的溫度換上新畫面。

狀態碼:後端寄回的「派送回執」

拆過請求與回應、也分清了標頭和內文,最後看回應開頭最關鍵的那一行:狀態碼(Status Code),一個三位數,一句話講完「這次到底怎麼了」。 訣竅是只看第一位數字就能抓大方向:2 開頭成功、3 開頭改投別處、4 開頭你寄錯了、5 開頭伺服器壞了。 點下面四類、再點各類裡不同的碼,看回執蓋什麼章、手錶又變成什麼樣子、出事時該找誰。
台北市9:41

24°

多雲時晴

最高 27° · 最低 19°

2xx成功該找誰:順利,不用查

照你說的做好了,結果在這。

重點回顧

從手錶查天氣這一趟,把 HTTP 從外面看到裡面。動手做過之後,帶走這三個重點:

  1. 1
    HTTP 是一問一答
    用戶端送請求(我要什麼)、伺服器回回應(結果在這)。手錶按一次「重新整理」,就是完整走一趟:請求過去、伺服器查資料、回應回來、畫面才更新。
  2. 2
    規則的重點是格式固定
    沒講好規則,程式收到什麼就畫什麼,俄文、ASCII 圖照畫不誤,誰也看不懂。講好規則之後格式固定、內容可變,程式一拆就中。
  3. 3
    回應拆三塊看
    狀態碼講成不成功(2 開頭成功、4 開頭請求有問題、5 開頭伺服器壞了);標頭是箱子外的說明單;內文才是你真正要的貨。

綜合檢測:這趟對話你看懂了嗎

回到那個沒有規則的宇宙:伺服器回的俄文和文言文,內容其實都是「台北 24 度」,為什麼手錶還是畫不出正常錶面?

想想手錶是誰在讀這些回覆:是人,還是程式?

0:00 / 0:00
0:000:00
下一課