小村軟體有限公司
第 6 章

觀察 — 用 curl 與開發者工具閱讀真實的 HTTP

curl -v 的 > 是送出的請求,< 是收到的回應。-I 只看標頭,-L 追蹤重新導向。搭配開發者工具的 Network 分頁,把 3 點組合閱讀法套用到實物上。

從教材裡的 HTTP,到真實的 HTTP

到前一章為止的 5 章,往返書信的書寫格式・動詞・回覆的數字・附註・快取,閱讀的工具都到齊了。本章要把它們套用到實物上。工具有 2 個 — 命令列的 curl,以及瀏覽器的開發者工具。

這 2 個的角色略有不同。curl 是把 1 條請求原原本本送出、讓你看到原始文字的顯微鏡;開發者工具是把整個頁面幾十條請求一覽無遺的雷達。深入看 1 條用 curl,從整體找異常用 Network 分頁,如此區分使用。

curl -v — 往返書信原樣流過

執行 curl -v https://example.com/(-v 是 verbose,詳細顯示),連同連線的經過,第 1 章讀過的骨架會原樣流過畫面。讀法的關鍵是行首的記號。

以 > 開頭的行 — 送出的東西
從我方到伺服器。請求行(GET / HTTP/1.1)與請求標頭
以 < 開頭的行 — 收到的東西
從伺服器到我方。狀態行(HTTP/1.1 200 OK)與回應標頭
以 * 開頭的行 — curl 的自言自語
DNS 解析・TCP 連線・TLS 交握的經過報告。第 1 章的 Step 1〜3 就在這裡看得見
沒有記號的行 — 內文
空行之後送達的本文(HTML 等)原樣顯示

也就是說,> 的那一塊是「請求了什麼」,< 的第 1 行是「結果如何」,接下來的 < 行是「條件與補充」— 3 點組合就這樣原樣排列著

在 curl -v 的輸出範例上,加上「* 是連線的經過、> 是送出的請求、< 是收到的回應」註解的圖

curl -v 輸出的註解圖。只要分得出 3 種記號(* / > / <),再長的輸出都能切成「準備」「請求的事」「回來的事」3 個區塊。

-I 與 -L — 只看標頭・追到轉送的盡頭

掌握調查中頻繁出現的 2 個選項。

curl -I(大寫的 I)是「只給我標頭」。因為用 HEAD 方法(第 2 章)發出請求,回來的只有狀態行與標頭。Content-Type・Content-Length・Cache-Control 這些附註,不下載本文就能確認。

$ curl -I https://example.com/
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
Cache-Control: max-age=86400

curl -L 是「請追到轉送的盡頭」。curl 預設不追蹤重新導向,會把 301/302 的回覆原樣呈現。這種誠實對調查很有用,「想轉送到哪裡」可以從 Location 標頭確認。想要最終內容時再加上 -L。瀏覽器總是自動做著相當於 -L 的動作,所以也可以說,用 curl 才第一次觀察得到「轉送本身」

練習 6-1 — 閱讀 curl 的輸出

curl -v 的記號,以及 -I・-L 的使用區分。第 1 章的骨架會原樣出現。

Q1. curl -v https://example.com/ 的輸出中,行首的 >< 的正確意義是哪一個?

Q2.不下載本文就確認巨大檔案的 Content-Type 與 Content-Length 時,最合適的 curl 用法是哪一個?

Q3. 執行 curl https://example.com/old-page 只回來 301 的回應,頁面的內容沒有顯示。能自動追到轉送目的地、取得內容的選項是哪一個?

開發者工具的 Network 分頁 — 懂了欄位的意義就不可怕

在瀏覽器打開開發者工具(多數環境是 F12),選擇 Network 分頁並重新載入頁面,該頁面發出的所有請求就會一行一條地排列。首先要讀的欄位有 4 個。

Status
狀態碼。紅色的行就是這裡是 4xx/5xx。調查從這一欄開始
Type
document / stylesheet / script / img 等,資源的種類。對應 Content-Type
Size
傳輸量。這裡若出現 (disk cache) / (memory cache),代表沒有向伺服器發出請求(第 5 章 fresh 的出口)。304 的行傳輸量應該只有數百位元組
Time
所需時間。效能調查時的主角

點擊某一行會打開 Headers 面板,可以確認請求行・狀態行・所有標頭 — 也就是本課程一路閱讀過來的那些文字本身。

還有一個要記住的核取方塊:Disable cache。它是只在開發者工具開著的期間停用快取、總是向伺服器取得的設定。在「修改沒有反映」時,它是切分「是快取的錯,還是真的沒有反映」的最短工具。

典型的觀察步驟 — 把 3 點組合套用到實物

被說「顯示怪怪的」「API 失敗了」時,整理一套符合本課程之型的步驟。

Step 1 — 找出失敗行,讀 Status
在 Network 分頁找到紅色的行(或可疑 URL 的行),用狀態碼的百位數分類是誰的問題(第 3 章)
Step 2 — 確認請求了什麼
該行的方法與 URL。懷疑「這真的是預期的收件地址・預期的動詞嗎」(第 1〜2 章)
Step 3 — 閱讀條件與補充
在 Headers 面板確認 Content-Type・Cache-Control・Cookie 等與症狀相關的附註(第 4〜5 章)
Step 4 — 把重現最小化
把可疑的那 1 條用 curl 單獨重現(-v 看全文,-I 只看標頭,-L 追到轉送的盡頭)。可以和瀏覽器特有的因素(快取・Cookie・擴充功能)切割開來

Step 4 之所以有效,是因為 curl 會送出乾乾淨淨的 1 條。在瀏覽器重現的問題若在 curl 不重現,該懷疑的是快取或 Cookie 等瀏覽器側的狀態 — 反過來若 curl 也重現,就能鎖定在伺服器側。

練習 6-2 — 閱讀 Network 分頁

在瀏覽器的開發者工具中閱讀同樣的 3 點組合。關鍵是快取的呈現方式。

Q4. 在開發者工具的 Network 分頁,某個 CSS 檔案那一行的 Size 欄顯示著 (disk cache)。正確的意義是哪一個?

Q5. 勾選 Network 分頁的「Disable cache」的正確目的是哪一個?

Q6. 接到「頁面顯示怪怪的」的回報而打開 Network 分頁時,符合本課程之型的最合適觀察第一步是哪一個?

本章帶回家的重點

  • curl -v 是 > = 送出的東西、< = 收到的東西、* = 連線的經過。3 點組合原樣排列
  • -I 是只看標頭(HEAD),-L 是追到重新導向的盡頭。預設不追蹤轉送的誠實,對調查很有效
  • Network 分頁依 Status → 方法與 URL → Headers 的順序讀。Size 欄的 (disk cache) 是「請求沒有發出」的標記
  • 瀏覽器能重現而 curl 不能重現,就是瀏覽器側的狀態;curl 也能重現,就是伺服器側 — 切分的定石

工具已全部到齊。最終章是綜合演練 — 把本課程的型套用到 8 個貼近實務的案例上解讀。