常見的 HTTP 狀態碼有哪些?
HTTP 狀態碼用于指示服務器對客戶端請求的響應結果,常見的 HTTP 狀態碼可以分為以下幾類:
1. 信息類(1xx)
- 100 Continue:客戶端應繼續發送請求。
- 101 Switching Protocols:服務器根據客戶端的請求切換協議。
2. 成功類(2xx)
- 200 OK:請求成功,響應體包含所請求的資源。
- 201 Created:請求成功并且服務器創建了新的資源。
- 202 Accepted:服務器已接受請求,但尚未處理完成。
- 204 No Content:服務器成功處理請求,但響應體為空。
3. 重定向類(3xx)
- 301 Moved Permanently:請求的資源已永久移動到新位置。
- 302 Found:請求的資源臨時移動到新位置。
- 304 Not Modified:資源未修改,客戶端可以使用緩存的版本。
4. 客戶端錯誤類(4xx)
- 400 Bad Request:請求語法錯誤或請求參數無效。
- 401 Unauthorized:請求未授權,需要身份驗證。
- 403 Forbidden:服務器拒絕請求,客戶端無權限訪問。
- 404 Not Found:請求的資源不存在。
- 405 Method Not Allowed:請求方法不被允許。
5. 服務器錯誤類(5xx)
- 500 Internal Server Error:服務器遇到意外情況,無法完成請求。
- 501 Not Implemented:服務器不支持請求的功能。
- 502 Bad Gateway:服務器作為網關或代理時,從上游服務器收到無效響應。
- 503 Service Unavailable:服務器暫時無法處理請求,通常由于過載或維護。
- 504 Gateway Timeout:服務器作為網關或代理時,未從上游服務器及時收到響應。
HTTP 請求包含哪些內容,請求頭和請求體有哪些類型?
HTTP 請求主要由以下幾個部分組成:
1. 請求行(Request Line)
請求行包含請求方法、請求的資源路徑以及 HTTP 協議版本。例如:
GET /index.html HTTP/1.1
2. 請求頭(Headers)
請求頭包含客戶端發送給服務器的額外信息,例如客戶端的類型、接受的內容類型、認證信息等。常見的請求頭類型包括:
- 通用頭(General Headers):適用于請求和響應,例如
Cache-Control
、Connection
、Date
、Pragma
。 - 請求頭(Request Headers):僅適用于請求,例如
Accept
、Accept-Charset
、Accept-Encoding
、Accept-Language
、Authorization
、Cookie
、Host
、User-Agent
。 - 響應頭(Response Headers):僅適用于響應,例如
Age
、Location
、Server
、Set-Cookie
。 - 實體頭(Entity Headers):適用于請求和響應中的實體部分,例如
Allow
、Content-Encoding
、Content-Language
、Content-Length
、Content-Location
、Content-MD5
、Content-Range
、Content-Type
、Expires
、Last-Modified
。
3. 請求體(Body)
請求體是請求中發送的實體內容,通常用于 POST、PUT 等方法。請求體的類型可以是多種格式,常見的包括:
- 表單數據(application/x-www-form-urlencoded):鍵值對形式的表單數據,例如
key1=value1&key2=value2
。 - 多部分表單數據(multipart/form-data):用于上傳文件等復雜數據,常用于文件上傳表單。
- JSON 數據(application/json):以 JSON 格式發送數據,適用于現代 Web API。
- XML 數據(application/xml):以 XML 格式發送數據。
- 原始數據(text/plain):純文本數據。
示例
請求行和請求頭示例
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: application/json
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
請求體示例(POST 請求)
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 45{"name": "John Doe", "age": 30}
在這個示例中,請求體是一個 JSON 格式的字符串,包含了用戶的信息。
HTTP 中 GET 和 POST 的區別是什么?
在 HTTP 協議中,GET 和 POST 是兩種常用的請求方法,它們在數據傳遞、安全性、使用場景等方面存在一些區別。以下是它們的主要區別:
1. 數據傳遞方式
-
GET:將請求參數附加在 URL 后面,以
?
分隔,參數之間用&
連接。例如:http://example.com/?key1=value1&key2=value2
。這種方式適合傳遞少量數據。 -
POST:將請求參數放在請求體中,不會顯示在 URL 中。例如:
POST /api/users HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencodedkey1=value1&key2=value2
這種方式適合傳遞大量數據。
2. 數據長度限制
- GET:由于 URL 長度有限制(不同瀏覽器和服務器限制不同,通常在 2048 字節左右),GET 請求的參數長度也受到限制。
- POST:請求體的長度沒有限制,可以傳遞大量數據。
3. 安全性
- GET:請求參數直接顯示在 URL 中,可能會被瀏覽器保存在歷史記錄或日志文件中,存在安全風險。
- POST:請求參數在請求體中,不會顯示在 URL 中,相對更安全。
4. 緩存機制
- GET:請求可以被瀏覽器緩存,適合用于獲取公共資源(如圖片、CSS 文件等)。
- POST:請求通常不會被緩存,適合用于提交敏感數據或執行改變服務器狀態的操作。
5. 使用場景
- GET:通常用于獲取資源,例如從服務器獲取網頁內容、搜索結果等。適合無副作用的操作。
- POST:通常用于提交數據,例如表單提交、文件上傳等。適合需要改變服務器狀態的操作。
6. 書簽功能
- GET:可以將請求的 URL 作為書簽保存,方便后續訪問。
- POST:無法將請求作為書簽保存,因為請求參數在請求體中。
7. 歷史記錄
- GET:請求的 URL 會保存在瀏覽器的歷史記錄中。
- POST:請求的 URL 會保存在瀏覽器的歷史記錄中,但請求體中的參數不會保存。
8. 冪等性
- GET:是冪等的,多次請求不會改變服務器狀態。
- POST:不是冪等的,多次請求可能會導致多次數據提交,改變服務器狀態。
示例對比
GET 請求示例
GET /search?q=java+design+patterns HTTP/1.1
Host: example.com
POST 請求示例
POST /api/login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencodedusername=JohnDoe&password=12345
總結
- GET 適合用于獲取資源、傳遞少量數據、可緩存的場景。
- POST 適合用于提交數據、傳遞大量數據、需要改變服務器狀態的場景。
選擇使用 GET 還是 POST,需要根據具體需求和場景來決定,以確保數據的安全性和請求的效率。