HTTP 狀態碼(status code)
當你向館員要一本書時,他回應的不只是那本書,還帶著一種語氣:「在這裡」(成功)、「它搬到樓上去了」(去別處找)、「我們沒有那本」(找不到),或「抱歉,燈剛剛燒掉了」(我們的錯)。HTTP 狀態碼(status code)正是伺服器蓋在每則回應上的那一行判決:一個三位數,在用戶端還沒看主體之前,就告訴它這個請求結果如何。
這些碼依第一位數字分組,這正是讀懂它們的全部訣竅。1xx 是資訊性的(很少見)。2xx 表示成功——200 OK 就是日常那句「這是你要的東西」。3xx 表示重新導向——301 Moved Permanently 說「這項資源現在改住在一個新 URL;請改去那裡」,而瀏覽器通常會自動跟過去。4xx 表示用戶端犯了錯——404 Not Found 表示那個 URL 上什麼也沒有,403 Forbidden 表示你沒有權限,400 表示你的請求格式不對。5xx 表示伺服器出了問題——500 Internal Server Error 表示伺服器在處理一個完全合法的請求時,自己的程式碼崩潰或壞掉了。
4xx 與 5xx 之間的劃分是最該內化的一件事:4xx 是「你(用戶端)弄錯了」,5xx 是「我(伺服器)弄錯了」。404 並不是伺服器的故障——伺服器運作正常,而且正確地告訴你那個頁面不存在。這個區別會驅動真實的決策:快取、監控儀表板與重試邏輯,對 404(別重試,它會一直不存在)與 503 Service Unavailable(也許稍後重試,伺服器只是現在過載)的處置方式都不一樣。
你點了一個舊書籤。伺服器回 301,並附上一個指向新 URL 的 Location 標頭;你的瀏覽器悄悄地對那個新位址重新發出請求,拿到 200。如果那個頁面真的不見了,你會拿到 404。如果該網站的資料庫崩潰了,即使你的請求完全合法,你也會拿到 500。
第一位數字就道盡一切:2 成功、3 去別處、4 你的錯、5 伺服器的錯。
200 只代表這則 HTTP 請求成功,並不代表你想做的那個操作成功了。一個 API 可以回 200,主體裡卻寫著「登入失敗」——這設計很草率,但合法。永遠要讀主體,而不是只看那個碼。