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