目錄
- 一、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. 網路運營商維護著本地域名伺服器,可能不需要再轉發到根,頂,權威域名伺服器(權威域名伺服器由域名解析服務商提供)。
-
Url 本身就是 uri 的子集,路徑還是引數都是 uri 的一部分。
-
拿到 ip 後怎麼訪問伺服器上的檔案,是根據路徑還是根據引數還是根據整個 uri,要看你所訪問伺服器的本地檔案系統和支援遠端檔案訪問的 server 型別。
-
比如你伺服器上安裝了 ftp 的 server,那麼你客戶端就可以使用 ftp 協議去訪問伺服器上的檔案系統,至於訪問到哪個檔案,根據你 ftp server 的配置來解析。
-
支援遠端檔案訪問的 server 是啥?它可以是很多東西,你可以用你的 tomcat,你可以用 jetty 這些 servlet 容器搭建一個,也可以用 netty 自己寫一個,甚至直接使用 nginx,說到 nginx 你或許就明白了——你的 uri 能訪問到哪個檔案,哪個路徑,假如是 http 協議的話,你可以用路徑對映,可以用引數對映,甚至可以用 header 甚至可以用 cookie 來對映。
-
檔案 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 部分不是瞎傳的。
request body 裡是的 json 格式,這是 http 協議裡面的資料型別。
注意:這裡是英文的引號。表單格式
:傳圖片、文字都可以。
看 post 請求的資料格式:就看 Content-Type。這裡的 Content-Type 是發出去的資料型別。
get 請求一般不寫 body。get 請求加上 body,需要後端做一些特殊的處理。前端如果把資料放到 body 中,後端可以獲取到。這樣比較麻煩,而且用 post 更加安全一些。
附 requests 官方文件: https://requests.readthedocs.io/zh_CN/latest/
公眾號清菡軟體測試首發,更多原創文章:清菡軟體測試 120+原創文章,歡迎關注、交流,禁止第三方擅自轉載。如有轉載,請標明出處。