當你在瀏覽器輸入url到發起http請求,這過程到底發生了什么?其實整個流程如下:
當用戶輸入url,操作系統會將輸入事件傳遞到瀏覽器中,在這過程中,瀏覽器可能會做一些預處理,比如 Chrome 會根據歷史統計來預估所輸入字符對應的網站,例如輸入goog,根據之前的歷史發現 90% 的概率會訪問「www.google.com 」,因此就會在輸入回車前就馬上開始建立 TCP 鏈接甚至渲染了。
接著是輸入url之后,點擊回車,這時瀏覽器會對 URL 進行檢查,首先判斷協議,如果是 http 就按照 Web 來處理,另外還會對這個 URL 進行安全檢查
安全檢查完成之后,在瀏覽器內核中會先查看緩存,然后設置 UA 等 HTTP 信息,接著調用不同平臺下網絡請求的方法。
注意:
瀏覽器和瀏覽器內核是不同的概念,瀏覽器指的是 Chrome、Firefox,而瀏覽器內核則是 Blink、Gecko,瀏覽器內核只負責渲染,GUI 及網絡連接等跨平臺工作則是瀏覽器實現的
dns查詢ip
DNS,英文是Domain Name System,中文叫域名系統,是Internet的一項服務,他將域名和IP地址相互映射的一個分布式數據庫
假設用戶在瀏覽器中輸入的是www.google.com,大概過程:
如果輸入的是域名,則需要進行dns查詢,將域名解析成ip;
進行DNS查詢的主機或軟件叫做DNS解析器,用戶使用的工作站或電腦都屬于解析器。域名解析就是利用DNS解析器得到對應IP過程,解析器會向域名服務器進行查詢處理。
主要過程如下:
如果以上都沒有找到,則繼續往下向dns域名服務器查詢
注意,
域名查詢時有可能是經過了CDN調度器的(如果有cdn存儲功能的話)
而且,需要知道dns解析是很耗時的,因此如果解析域名過多,會讓首屏加載變得過慢,可以考慮dns-prefetch優化
tcp/ip請求
有了 IP 地址,就可以通過 Socket API 來發送數據了,這時可以選擇 TCP 或 UDP 協議。
http本質是tcp協議。
TCP是一種面向有連接的傳輸層協議。他可以保證兩端(發送端和接收端)通信主機之間的通信可達。他能夠處理在傳輸過程中丟包、傳輸順序亂掉等異常情況;此外他還能有效利用寬帶,緩解網絡擁堵。
建立TCP連接一開始都要經過三次握手:
三次握手
第一次握手,請求建立連接,發送端發送連接請求報文
第二次握手,接收端收到發送端發過來的報文,可知發送端現在要建立聯機。然后接收端會向發送端發送一個報文
第三次握手,發送端收到了發送過來的報文,需要檢查一下返回的內容是否是正確的;若正確的話,發送端再次發送確認包
在TCP連接建立完成之后就可以發送HTTP請求了。
注意
瀏覽器對同一個域名有連接數限制,大部分是 6,http1.0中往往一個資源下載就需要對應一個tcp/ip請求,而像 HTTP 2.0 協議盡管只使用一個 TCP 連接來傳輸數據,但性能反而更好,而且還能實現請求優先級。
后面會分享更多devops和DBA內容,感興趣的朋友可以關注下!!
HTML 使用超級鏈接與網絡上的另一個文檔相連。幾乎可以在所有的網頁中找到鏈接。點擊鏈接可以從一張頁面跳轉到另一張頁面。
HTML 鏈接
如何在HTML文檔中創建鏈接。
(可以在本頁底端找到更多實例)
HTML 超鏈接(鏈接)
HTML使用標簽 <a>來設置超文本鏈接。
超鏈接可以是一個字,一個詞,或者一組詞,也可以是一幅圖像,您可以點擊這些內容來跳轉到新的文檔或者當前文檔中的某個部分。
當您把鼠標指針移動到網頁中的某個鏈接上時,箭頭會變為一只小手。
在標簽<a> 中使用了href屬性來描述鏈接的地址。
默認情況下,鏈接將以以下形式出現在瀏覽器中:
一個未訪問過的鏈接顯示為藍色字體并帶有下劃線。
訪問過的鏈接顯示為紫色并帶有下劃線。
點擊鏈接時,鏈接顯示為紅色并帶有下劃線。
注意:如果為這些超鏈接設置了 CSS 樣式,展示樣式會根據 CSS 的設定而顯示。
HTML 鏈接語法
鏈接的 HTML 代碼很簡單。它類似這樣::
<a href="url">鏈接文本</a>
href 屬性描述了鏈接的目標。.
實例
<a >訪問菜鳥教程</a>
上面這行代碼顯示為:: 訪問菜鳥教程
點擊這個超鏈接會把用戶帶到菜鳥教程的首頁。
提示: "鏈接文本" 不必一定是文本。圖片或其他 HTML 元素都可以成為鏈接。
HTML 鏈接 - target 屬性
使用 target 屬性,你可以定義被鏈接的文檔在何處顯示。
下面的這行會在新窗口打開文檔:
實例
<a>訪問菜鳥教程!</a>
HTML 鏈接- id 屬性
id屬性可用于創建在一個HTML文檔書簽標記。
提示: 書簽是不以任何特殊的方式顯示,在HTML文檔中是不顯示的,所以對于讀者來說是隱藏的。
實例
在HTML文檔中插入ID:
<a id="tips">有用的提示部分</a>
在HTML文檔中創建一個鏈接到"有用的提示部分(id="tips")":
<a href="#tips">訪問有用的提示部分</a>
或者,從另一個頁面創建一個鏈接到"有用的提示部分(id="tips")":
<a >
訪問有用的提示部分</a>
基本的注意事項 - 有用的提示
注釋: 請始終將正斜杠添加到子文件夾。假如這樣書寫鏈接:,就會向服務器產生兩次 HTTP 請求。這是因為服務器會添加正斜杠到這個地址,然后創建一個新的請求,就像這樣:。
圖片鏈接
如何使用圖片鏈接。
在當前頁面鏈接到指定位置
如何使用書簽
跳出框架
本例演示如何跳出框架,假如你的頁面被固定在框架之內。
創建電子郵件鏈接
本例演示如何如何鏈接到一個郵件。(本例在安裝郵件客戶端程序后才能工作。)
建電子郵件鏈接 2
本例演示更加復雜的郵件鏈接。
HTML 鏈接標簽
標簽 | 描述 |
---|---|
<a> | 定義一個超級鏈接 |
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
HTTP協議報文有了充分了解之后,上一節我們對get請求進行了詳盡的測試,由于get請求沒有請求體,相對來說比較簡單,接下來我們加上請求體,看看使用post接口如何完成各種不同類型請求體的請求操作。
需要注意的是,post請求也并不一定都有請求體,遇到沒有請求體的post接口,處理方式和get請求完全一致。
請求需要用到的四要素中:HTTP方法和url地址是顯而易見的;沒有特殊說明時,基本的請求頭不需要關注,Postman會自動添加;重點關注請求體以及與它配套的Content-Type頭域。
常用的接口測試請求體的編輯格式包括如下幾種,和Content-Type頭域分別對應:
這里的Content-Type頭域和請求體的關系,相當于快遞運輸時的運輸方式,比如請求體是水,就用常溫運輸,如果是冰,就需要冷藏的方式運輸了。
接下來幾節,我們分別來看各種請求體格式應該如何使用Postman完成請求。
請求示例:
本例使用的接口為電商項目登錄接口,接口信息如下
通過抓包獲取接口的基本信息,可以看到請求頭中Content-Type字段值為application/x-www-form-urlencoded,它的格式我們非常熟悉,和url中?后面的參數格式相同,為鍵=值&鍵=值得格式。
可以在fiddler或者其它抓包工具中查看請求參數的美化組織格式,上述請求體對應于webform格式下的請求體內容以表格形式顯示如下:
Postman完成請求:
針對application/x-www-form-urlencoded格式,可以用兩種方式在postman的Body菜單中填寫:
注意不要把請求url地址的參數也填寫進來了,那些參數在Params菜單中。
編輯完請求體之后可以查看Headers中的頭域信息,會發現除了基本頭域以外,加入了Content-Type和Content-Length兩個頭域,分別表示請求體的類型和長度。
由此可見,當選擇x-www-form-urlencoded時,postman會自動在頭域中添加請求體相關的頭域參數設置。
這里返回體格式直接以純文本形式當做HTML顯示,其中的中文內容還是未經處理的unicode編碼,可以通過切換返回體的格式下拉欄菜單為JSON,以美化后的格式顯示,并對中文等特殊符號進行轉碼。
在Body菜單中選擇raw格式,然后將原始url編碼字符串直接粘貼進輸入欄中,發起請求會發現返回結果是請填寫賬號或密碼,說明我們的請求體內容中攜帶的用戶名密碼等信息并沒有被服務器接受。
切換到Headers中查看,會發現其中的Content-Type并不是applicaiton/x-www-form-urlencoded,而是text/plain純文本格式的請求,因而才會導致請求體格式不被服務器接受。
相當于服務器原本是希望收到冷凍起來的冰,而我們卻選擇了常溫運輸方式,服務器也就認為自己沒有收到需要的用戶名密碼。
因此我們要做的處理是在Headers中修改Content-Type的值,由于原本自動添加的Content-Type不能修改,因此取消勾選并新增一個Content-Type,值為application/x-www-form-urlencoded
重新發送之后,就可以得到正確的請求結果了。
希望本文對你有所幫助~~如果對軟件測試、接口測試、自動化測試、面試經驗交流感興趣可以私聊我或關注公眾號“特斯汀軟件測試”。免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一起交流。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。