本文收錄於 GitHub 日問: DailyQuestion[1],內含大廠內推機會、面經大全及若干面試題,每天學習五分鐘,一年進入大廠中。可在右下角打開原文查看
大廠面經大全: https://q.shanyue.tech/interview.html大廠內推大全: https://q.shanyue.tech/infer/肯定會碰到: 101/200/301/302/304/400/404/502可能會碰到: 101/200/201/204/206/301/304/307/400/401/403/404/405/413/418/422/429/500/501/502/503/504 101 Switch Protocol升級協議,如從 http 到 ws,此時需要反向代理支持,如 Nginx,在 Nginx 配置 websockt 如下:
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}示例:
101 200 Ok表示資源請求成功,也是最常見到的狀態碼
示例:
$ curl https://shanyue.tech --head
HTTP/2 200
201 Created資源創建成功,多用於 POST 請求
204 No Content響應不會返回 Body,一般由以下兩種情況
示例一: 掘金為 Options 請求的狀態碼設置為 204
掘金為 Options 請求的狀態碼設置為 204示例二: 知乎為 Delete 請求的狀態碼設置為 204,以下請求為取消關注
掘金為 Delete 請求的狀態碼設置為 204示例三: 當你在知乎看段子時,不妨打開控制臺,會發現一個是 204 的狀態碼
curl 'https://www.zhihu.com/sc-profiler' \
-H 'content-type: application/json' \
--data-binary '[["i","production.heifetz.main.desktop.v1.Collector.screen.1536_960.count",1,1]]' \
--compressed -vvv
< HTTP/2 204
< server: CLOUD ELB 1.0.0
< date: Thu, 22 Oct 2020 07:46:30 GMT
< content-type: text/html
< vary: Accept-Encoding
< x-backend-response: 0.002
< cache-control: no-cache, no-store, must-revalidate, private, max-age=0
206 Partial Content當請求多媒體數據數據較大時,會進行分片傳輸。當你在 B 站觀看視頻,打開開發者工具,會發現許多 206 狀態碼以及響應頭 Content-Range
示例:
B站上的視頻資源請求狀態碼為206 301 Moved Permanently永久重定向。http 轉向 https 時,有時會使用 301,此時瀏覽器會自動緩存,下次直接自動跳轉,不再請求伺服器。當更新域名需要 SEO 優化時,同樣使用 301 或者 308。如 B 站:
$ curl www.bilibili.com -vvv
< HTTP/1.1 301 Moved Permanently
< Server: Tengine
< Date: Thu, 22 Oct 2020 08:04:59 GMT
< Content-Type: text/html
< Content-Length: 239
< Connection: keep-alive
< Location: https://www.bilibili.com/
302 Found暫時重定向。http 轉向 https 時,有時也會使用 302,如知乎的跳轉
$ curl www.zhihu.com -vvv
< HTTP/1.1 302 Found
< Location: https://www.zhihu.com/
< Content-Length: 0
< X-NWS-LOG-UUID: 16068764905156850032
< Connection: keep-alive
< Server: Lego Server
< Date: Thu, 22 Oct 2020 08:20:29 GMT
< X-Cache-Lookup: Return Directly
304 Not Modified資源已被緩存,與之相關的響應頭部有:
last-modified/if-modified-since一般用作 index.html 等不帶 hash 的資源,由於示例太多,這裡就不舉例了
307 Temporary Redirect暫時重定向。也可作為 http 到 https 的重定向。還有一種用途用作 HSTS,當谷歌瀏覽器發現某 http 資源已被加入到 HSTS 列表,瀏覽器內部會通過 307 作重定向
示例:
山月個人博客網站的 HSTSStackoverflow 中的307http 狀態碼中 301,302 和 307 有什麼區別 (opens new window)[2]
301,Moved Permanently。永久重定向,該操作比較危險,需要謹慎操作:如果設置了 301,但是一段時間後又想取消,但是瀏覽器中已經有了緩存,還是會重定向。302,Found。臨時重定向,但是會在重定向的時候改變 method: 把 POST 改成 GET,於是有了 307307,Temporary Redirect。臨時重定向,在重定向時不會改變 method 308 Permanent Redirect永久重定向。與 301 不同的是,當它重定向到新的地址時,並不會改變 method。
400 Bad Request對於伺服器無法理解的參數,將會使用 400 作為返回碼
示例一: 當 Content-Type: JSON 時,伺服器解析 JSON 卻失敗
HTTP/1.1 400 Bad Request
Content-Length: 35
{"message":"Problems parsing JSON"}
401 Unauthorized當沒有權限的用戶請求需要帶有權限的資源時,會返回 401,此時攜帶正確的權限憑證再試一次可以解決問題
有時認證失敗也會返回 401
示例一: 知乎登錄時密碼不正確
知乎登錄失敗時示例二: Github 中錯誤的憑證信息請求帶權限資源
$ curl -i https://api.github.com -u foo:bar
> HTTP/1.1 401 Unauthorized
> {
> "message": "Bad credentials",
> "documentation_url": "https://developer.github.com/v3"
> }
403 Forbidden我就是不想讓你訪問,不管你的權限憑證是否正確!
In summary, a 401 Unauthorized response should be used for missing or bad authentication, and a 403 Forbidden response should be used afterwards, when the user is authenticated but isn’t authorized to perform the requested operation on the given resource.
403 與 401 狀態碼有什麼區別 (opens new window)[3] 404 Not Found未找到資源
405 Method Not Allowed我需要 POST 這條資源,你去 GET 個錘子
413 Payload Too Large不要給我扔這麼大的 Body,我處理不過來
418 I'm A Teapot我是一個茶壺
我要拋咖啡,你卻扔給我一個茶壺?
也可以用來處理不合法的參數校驗,我想要個字符串,你給了我一個整數?
422 Unprocessable Entity常用來處理不合法的參數校驗。
Github 上給某個項目點讚時,故意設置一個不正確的參數命名,會返回狀態碼 422
422 429 Too Many Request請求過多被限流。
超過某一個 API 的 Rate Limit 規則,會被限流,返回 429 狀態碼
示例: 在 Sentry 中異常上報過於頻繁被限流
500 Internal Server Error伺服器內部錯誤,很有可能是應用層未捕獲錯誤而導致整個服務掛掉
502 Bad GatewayNginx 上常見,從上遊應用層未返迴響應,上遊應用層掛了
由於大量流量造成服務忙,稍等一下說不定就能用了
網關超時,上遊應用層遲遲未響應
參考資料[1]DailyQuestion: https://q.shanyue.tech
[2]http 狀態碼中 301,302和307有什麼區別 (opens new window): https://github.com/shfshanyue/Daily-Question/issues/37
[3]403與401狀態碼有什麼區別 (opens new window): https://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses
- END -