基礎篇-http協議《http 簡介、url詳解、request》

清菡發表於2021-01-18

目錄

  • 一、http 簡介
  • 二、url 詳解
  • 三、request
    • 1.get 和 post
    • 2.請求方法
    • 3.request 組成
    • 4.請求頭
    • 5.get 請求引數
    • 6.post 請求引數
    • 7.post 的 body

一、http 簡介

http 協議包含request(你發過去的內容)和response(返回來的內容)。http(超文字傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議。

請求響應互動圖

伺服器上可以配置域名和伺服器 ip 地址的對映,你訪問的 url 到達網路通訊商(比如聯通、電信、移動),他們會再轉發到域名地址解析服務商那,根據你請求的域名解析成具體的 ip,這樣就能找到你要訪問的伺服器了,解析到伺服器後,再根據配置的 url 的路徑找到伺服器下對應路徑下的檔案,伺服器根據你的請求再將內容返回到你這端。

所以,輸入百度的 url 地址就看到百度的頁面了。我之前寫過文章通讀《圖解 HTTP》腦圖可以看下。

開發-洛丹倫的夏天的補充:

“ 1. 網路運營商維護著本地域名伺服器,可能不需要再轉發到根,頂,權威域名伺服器(權威域名伺服器由域名解析服務商提供)。

  1. Url 本身就是 uri 的子集,路徑還是引數都是 uri 的一部分。

  2. 拿到 ip 後怎麼訪問伺服器上的檔案,是根據路徑還是根據引數還是根據整個 uri,要看你所訪問伺服器的本地檔案系統和支援遠端檔案訪問的 server 型別。

  3. 比如你伺服器上安裝了 ftp 的 server,那麼你客戶端就可以使用 ftp 協議去訪問伺服器上的檔案系統,至於訪問到哪個檔案,根據你 ftp server 的配置來解析。

  4. 支援遠端檔案訪問的 server 是啥?它可以是很多東西,你可以用你的 tomcat,你可以用 jetty 這些 servlet 容器搭建一個,也可以用 netty 自己寫一個,甚至直接使用 nginx,說到 nginx 你或許就明白了——你的 uri 能訪問到哪個檔案,哪個路徑,假如是 http 協議的話,你可以用路徑對映,可以用引數對映,甚至可以用 header 甚至可以用 cookie 來對映。

  5. 檔案 server 的本質其實就是,客戶端與伺服器檔案系統的一箇中間層,uri 與檔案系統的對映,取決於你這個 server 里程式是怎麼個邏輯。直白的講,用過 springboot,裡面的 ResourceHandler,瞭解下。”

二、url 詳解

http/https 協議型別
port 埠號。(預設埠是 80,它是可以省略的)
path 請求的路徑(host 之後,問號之前)。路徑就是通常說的介面地址。
比如baidu.com/s/xxx/sss?tn=40039514_1_oem_dg/s/xxx/sss就是路徑。
介面文件上路徑就是這部分,不會寫 host 地址(比如 www.baidu.com)。因為介面的話,可以切換到不同的服務上,部署的機器可以搭建在不同的測試環境上,所以只會寫相對路徑。
引數 name=value
? 是分割,前面是地址,後面是它帶的引數。就是訪問這個地址的時候攜帶的引數。多個引數用&符合隔開。
& 多個引數用&隔開,沒有引數可以不寫。
  • host : 主機地址或域名。
    • 192.168.x.xx:8080 地址+埠號。(經常看到測試環境是這樣的地址)
    • www.xxx.com 是域名。
    • localhost:8080 中 localhost 是本機地址。

https 和 http 相比,就是多了一個證書。一般測試環境是 http,正式環境是 https。

/s是伺服器上的路徑,這個路徑和電腦上的路徑是一樣的。比如 c 盤什麼的。Linux 裡面沒有 d 盤 c 盤這種之分,只有地址。訪問的是這個伺服器的地址。

開啟其它的網站都是這樣一個標準的格式。

因為本機可以搭建不同的服務,81 埠,80 埠,不同的埠訪問的是不同的服務。

http 協議裡面 url 地址裡面的內容是通過 UrlEncode 這種編碼統一編碼的。如果是中文,會自動轉換成這種編碼:%e6%b8%85%e8%8f%a1%e7%9a%84%e5%8d%9a%e5%ae%a2

這樣的話,不同的伺服器都可以解析出來。

三、request

用 fiddler 這個工具抓包看下。

1.get 和 post

request:

從協議的內容上看,這就是 get 和 post 最明顯的區別。

2.請求方法

根據 http 標準,http 請求可以使用多種方法。

http1.0 定義了三種請求方法:get,post 和 head 方法。
http1.1 新增了五種請求方法:options,put,delete,trace 和 connect 方法。一共是八種方法。
get 請求指定的頁面資訊,並返回實體主體。
head 類似於 get 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。
put 從客戶端向伺服器傳送的資料取代指定的文件的內容。
post 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。post 請求可能會導致新的資源的建立或已有資源的修改。
delete 請求伺服器刪除指定的頁面。
connect http/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器。
options 允許客戶端檢視伺服器的效能。
trace 回顯伺服器收到的請求,主要用於測試或診斷。

從功能上講,get 和 post 實現的功能都是一樣的。get 從服務端讀取資料,post 也可以的。get 也可以往服務端提交資料。

get 的 url 後面可以帶引數。post 的 url 後面也可以帶引數,引數也可以放在 body 部分。

有點區別:

post 請求的 body 部分提交的資料可以比較大。body 部分可以提交圖片、檔案之類的。
但是 get 請求提交的時候,url 上面可提交的資料量比較小。url 上如果想帶張圖片是不可以的。

3.request 組成

空行是固定格式,區分請求頭和請求 body 的。

user-Agent:顯示是從哪個客戶端發出去的。如果是從火狐瀏覽器發出去的,這塊的內容會告訴你它是火狐瀏覽器。如果是從谷歌瀏覽器發出去的,這塊的內容會告訴你它是谷歌瀏覽器。

服務端收到了 user-Agent 這個引數後,它知道你是從哪個瀏覽器發出去的。後端統計資料的時候,可以分析出我的網站訪問的使用者是用哪個瀏覽器訪問的最多,哪個瀏覽器訪問的少。

如果識別 user-Agent 沒有客戶端型別的話,可能就拒絕你的請求,因為可能通過指令碼訪問的。服務端通過 user-Agent 這個引數控制。

Accept:這個協議接收的資料型別是哪些。發出去後,需要接收哪些資料型別,告訴服務端,可以接收 image/webp 這些,可以接收哪種資料型別等。

Accept-Encoding:代表可以支援哪些壓縮格式。不是電腦上普通的壓縮格式,協議裡面它有自己的壓縮格式。例如 gzip,deflate,br。

當服務端返回的資料量比較大的時候,通過壓縮的話,可以節省流量。1 兆的圖片直接用原始資料去傳輸,要消耗 1 兆的網路,用手機去訪問,發現流量消耗的非常的快並且給服務端造成很大的壓力。

就像給同學發視訊要壓縮下,這樣視訊變小了,傳起來快了,道理都是一樣的。服務端返回資料的時候也可以壓縮。

這個意思是說:從服務端返回的 body 內容被編碼了,需要解開壓縮。

不然的話,顯示的就是亂碼:

點選這個提示,就解壓了,解壓之後就顯示正常的內容了:

4.請求頭

如果是 post 請求,多了個引數叫做Content-Type:告訴服務端資料是什麼型別。get 請求沒這個引數,post 請求必須有這個引數。

post 請求資料型別比較多,肯定先宣告,不然服務端沒辦法正確得解析。

5.get 請求引數

get 請求引數都在請求行裡。可以在 Webforms(Webforms 是解析它的引數的意思)的 QueryString(QueryString 是 url 地址後面的引數)檢視。

根據域名找到剛才模擬請求的介面,可以檢視到引數:

6.post 請求引數

請求引數可以是請求行的引數,也可以是請求行的引數+body 的引數。

post 請求,QueryString 也有引數。例如:http://www.example.com/?1=1

QueryString+body

QueryString 可以為空,body 也可以為空。

Content-Type: application/x-www-form-urlencoded

QueryString 部分是 url 裡面的引數,body 部分就是 request body 的引數了。

User-Agent: Fiddler
Host: www.example.com
Content-Length: 13
Content-Type: application/json

request body:

{"111":"ddd"}

7.post 的 body

post 請求的 body 部分不是瞎傳的。

body常見的5種資料型別

request body 裡是的 json 格式,這是 http 協議裡面的資料型別。

注意:這裡是英文的引號。表單格式:傳圖片、文字都可以。

看 post 請求的資料格式:就看 Content-Type。這裡的 Content-Type 是發出去的資料型別。

get 請求一般不寫 body。get 請求加上 body,需要後端做一些特殊的處理。前端如果把資料放到 body 中,後端可以獲取到。這樣比較麻煩,而且用 post 更加安全一些。

附 requests 官方文件: https://requests.readthedocs.io/zh_CN/latest/


公眾號清菡軟體測試首發,更多原創文章:清菡軟體測試 120+原創文章,歡迎關注、交流,禁止第三方擅自轉載。如有轉載,請標明出處。

相關文章