HTTP請求與響應簡析

cola_bottle發表於2019-04-19

簡介

HTTP是一種檔案傳輸協議,規定瀏覽器與伺服器的傳輸規則,主要有請求與響應兩部分。

命令列傳送get請求

$ curl -v -- "https://www.baidu.com"
複製程式碼

如上就是curl傳送get請求的寫法,你會看到如下內容

* Rebuilt URL to: www.baidu.com/
*   Trying 104.193.88.123...
* TCP_NODELAY set
* Connected to www.baidu.com (104.193.88.123) port 80 (#0)
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Sat, 13 Oct 2018 03:25:42 GMT
< Etag: "588604eb-94d"
< Last-Modified: Mon, 23 Jan 2017 13:28:11 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc>
複製程式碼

以上內容中分別是什麼意思呢?

  1. 星號*開頭的書註釋
  2. 大於號>開頭的是請求資訊
  3. 小於號<開頭的是響應資訊
  4. 後面的是響應內容

命令列傳送post請求

$ curl -X POST -v -- "https://www.baidu.com"
複製程式碼

內容如下

> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 5
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 5 out of 5 bytes
< HTTP/1.1 302 Found
< Connection: Keep-Alive
< Content-Length: 17931
< Content-Type: text/html
< Date: Fri, 19 Apr 2019 07:44:58 GMT
< Etag: "54d97487-460b"
< Server: bfe/1.0.8.18
<
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style data-for="result" id="css_result">
複製程式碼

請求頭Header

傳送請求的時候,一般需要把伺服器需要的資料傳送過去,可以在命令中加入 -H "xxx: yyy" 到請求頭中,注意:加入請求頭的內容必需是 key: value 的形式

$ curl -X POST -v -H "xxx:yyy" -- "https://www.baidu.com"
複製程式碼
> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
> xxx:yyy
>
< HTTP/1.1 302 Found
< Connection: Keep-Alive
< Content-Length: 17931
< Content-Type: text/html
< Date: Fri, 19 Apr 2019 07:51:58 GMT
< Etag: "54d97488-460b"
< Server: bfe/1.0.8.18
<
複製程式碼

請求的內容中就多了一行>xxx:yyy

請求格式

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. 第二部分包括了請求內容(請求頭)
  4. 第三部分是一個回車換行符,用來分割第二部分和第四部分
  5. 第四部分是傳送的資料

注意

  1. 這裡的路徑包括「查詢引數」,但不包括「錨點」
  2. 可用的請求方法有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
  3. 如果你沒有寫路徑,那麼路徑預設為 /
  4. 第二部分中的 Content-Type 標註了第 4 部分的格式

響應格式

1 協議/版本號 狀態碼 狀態解釋
2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html
3
4 要下載的內容
複製程式碼
  1. 第一部分首先說明我用什麼版本(版本)的什麼協議(協議),狀態碼以及解釋
  2. 第二部分包括了響應的資訊,但是不是主要內容,只是此次響應的基本資訊
  3. 第三部分也是一個回車換行符,用來分割第二部分和第四部分
  4. 第四部分才是響應的內容,一般為JSON資料或者HTML頁面

用Chrome瀏覽器傳送HTTP請求

  1. 開啟Network
  2. 位址列輸入地址
  3. 在Network點選, 檢視request,點選「view source」
  4. 你會看到請求的前三部分
  5. 如果有第四部分, 可以在FormData或Payload中看到

用Chrome瀏覽器檢視HTTP響應

  1. 開啟Network
  2. 位址列輸入地址
  3. 選中第一個響應
  4. 檢視 Response Headers,點選「view source」
  5. 你會看到響應的前兩部分
  6. 檢視 Response 或者 Preview,你會看到響應的第 4 部分

相關文章