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

目錄

  • 一、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:顯示是從哪個客戶端發出去的。如果是從火狐瀏覽器發出去的,這塊的內容會告訴你它是火狐瀏覽器。如果是從Google瀏覽器發出去的,這塊的內容會告訴你它是Google瀏覽器。

服務端收到了 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 也有參數。例如://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 官方文檔: //requests.readthedocs.io/zh_CN/latest/


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