HTTP入門(請求與響應的基本知識)

摘要:本文主要介紹HTTP的最基本的知識,包括request請求、response響應、常見的響應狀態碼、GET請求與POST請求的區別。

一、HTTP 請求

1. http請求操作/curl命令

  • curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://GET獲取操作
    請求內容
GET / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx

  • curl -X POST -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://POST上傳操作
    請求內容
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
Frank: xxx
  • curl -X POST -d "1234567890" -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://POST上傳帶數據
    請求內容
POST / HTTP/1.1
Host: www.baidu.com
User-Agent: curl/7.54.0
Accept: */*
yyy: xxx
Content-Length: 10
Content-Type: application/x-www-form-urlencoded

1234567890

注:第二部分中,至少需要有HostContent-LengthContent-Type

2. 綜上所得,請求一共包含以下部分

  • 1 動詞 路徑 協議/版本
    2 Key1: value1
    2 Key2: value2
    2 Key3: value3
    2 Content-Type: application/x-www-form-urlencoded
    2 Host: www.baidu.com
    2 User-Agent: curl/7.54.0
    3
    4 要上傳的數據

  • 其中需要注意的是

    1. 請求最多包含四部分,最少包含三部分,即第四部分數據可以為空。
    2. 第三部分永遠都是一個回車,用來分隔第二、第四部分。
    3. 第一部分的動詞包括GET(獲取)/POST(上傳,新增)/PUT(整體更新)/PATCH(局部更新)/DELETE(刪除)/HEAD(獲取資源的元數據)/OPTIONS(獲取信息,關于資源的哪些屬性是客戶端可以改變的)等。
    4. 如果沒有寫路徑,則默認為根目錄(即 /
    5. 第二部分中的的 Content-Type 標注了第 4 部分的格式
    6. 第一部分的路徑,包含查詢參數,但不包括錨點

3. 使用Chrome瀏覽器查看http請求

  1. 打開 控制臺中的Network面板
  2. 地址欄輸入網址
  3. 在 Network 點擊,查看 request,點擊「view source」
  4. 如果有請求的第四部分,那么在 FormData 或 Payload 里面可以看到

舉例說明(百度首頁請求):

百度首頁請求

二、HTTP 響應

1.http響應出現在請求結束后

curl -s -v -H "Frank: xxx" -- "https://www.baidu.com"http://GET獲取操作
獲得的響應代碼為:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2443
Content-Type: text/html
Date: Tue, 10 Oct 2017 09:14:05 GMT
Etag: "5886041d-98b"
Last-Modified: Mon, 23 Jan 2017 13:24:45 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

<!DOCTYPE html>
<html lang="en">
………………以下為網頁html代碼,略…………
</html>

2. http響應包含以下部分

  • 1 協議/版本號 狀態碼 狀態解釋
    2 Key1: value1
    2 Key2: value2
    2 Content-Length: 17931
    2 Content-Type: text/html
    3
    4 要下載的內容
  • 其中需要注意的是
    第 2 部分中的 Content-Type 標注了第 4 部分的格式
    第 2 部分中的 Content-Type 遵循 MIME 規范
    第一部分的狀態解釋沒什么用

3. 關于響應的狀態碼

  • 1xx消息:代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,并以空行結束。(不常用,大致知道即可)

  • 2XX:表示成功

    • 200 OK:請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
    • 204 No Content:表示請求已成功處理,但是沒有內容返回,意思等同于請求執行成功,但是沒有數據,瀏覽器不用刷新頁面,也不用導向新的頁面。
    • 206 Partial Content:服務器已經成功處理了部分GET請求。(客戶端進行了范圍請求) 響應報文中包含Content-Range指定范圍的實體內容。
  • 3XX:重定向

    • 301 Moved Permanently:表示訪問的資源被永久移除,即請求的資源已經永久的搬到了其他位置 。
    • 302 Found :表示所訪問的資源臨時被移除,以后還會回來,即臨時重定向,表示請求的資源臨時搬到了其他位置 。
    • 303 See Other :表示請求資源存在另一個URI,應使用GET定向獲取請求資源 。
    • 304 Not Modified :表示資源未被修改,即客戶端仍然具有以前下載的副本,不需要重新傳輸資源。
    • 307 Temporary Redirect:臨時重定向,和302有著相同含義 ,盡管302標準禁止POST變為GET,但沒人聽他的 ,而307就會遵照標準,不會從POST變為GET
      但處理響應行為,各個瀏覽器可能不同。
  • 4XX:客戶端錯誤

    • 400 Bad Request:表示請求報文存在語法錯誤或參數錯誤,服務器不理解 ,服務器不應該重復提交這個請求 ,需要修改請求內容后再次發送。
    • 401 Unauthorized:表示發送的請求需要有HTTP認證信息或者是認證失敗了 ,返回401的響應必須包含一個適用于被請求資源的WWW-Authenticate首部以質詢用戶信息 ,瀏覽器初次接受401時,會彈出認證窗口。
    • 403 Forbidden :表示對請求資源的訪問被服務器拒絕了 ,服務器可以對此作出解釋,也可以不解釋 ,想說明的話可以在響應實體的主體部分描述原因 。比如說你可能沒有訪問權限。
    • 404 Not Found:表示服務器找不到你請求的資源 ,但允許用戶的后續請求。
  • 5XX:服務器錯誤

    • 500 Internal Server Error:通用錯誤消息,服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤信息。
    • 502 Bad Gateway:作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
    • 503 Service Unavailable:表示服務器超負載或正停機維護,無法處理請求 ,如果服務器知道還需要多長時間,就寫入Retry-After首部字段返回。

4. 使用Chrome瀏覽器查看http響應

  1. 打開 Network
  2. 輸入網址
  3. 選中第一個響應
  4. 查看 Response Headers,點擊「view source」
  5. 你會看到響應的前兩部分
  6. 查看 Response 或者 Preview,你會看到響應的第 4 部分

舉個例子:百度首頁響應代碼

百度首頁響應代碼

三、GET 和 POST 的區別是什么

這是一個很常見的面試題,我這里總結的答案是:

  • 參數。GET 的參數放在 url 的查詢參數里,POST 的參數(數據)放在請求消息體里
  • 安全GET 沒有 POST 安全(當然實際上二者都沒有那么的安全)。因為GET請求很容易偽造(比如<a><img><link><script><form>標簽都可以發送GET請求)。
  • 數據長度。GET 的參數(url查詢參數)有長度限制,一般是 1024 個字符。POST 的參數(數據)沒有長度限制(話雖這么說,但實際POST還是有4~10Mb 的限制,但是相對于GET已經大多了)
  • 。GET 請求只需要發一個包,POST 請求需要發兩個以上包(因為 POST 有消息體)(雖然GET 也可以用消息體但是不常用)
  • 作用。GET 用來讀數據,POST 用來寫數據,POST 不冪等(冪等的意思就是不管發多少次請求,結果都一樣。)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容