大家一直都在說接口自動(dòng)化,但對于接口測試的基礎(chǔ)HTTP協(xié)議,你了解多少呢?
HTTP協(xié)議采用了請求/響應(yīng)模型??蛻舳税凑找欢ǖ囊?guī)則請求,服務(wù)端響應(yīng)對應(yīng)的請求。HTTP協(xié)議的全名叫超文本傳輸協(xié)議,為英文HyperText Transfer Protocol,的縮寫,是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。
我作為APP測試人員,經(jīng)常用fiddler抓包,比較好奇這些抓到的包,每項(xiàng)是什么含義,具體代表什么,那么我們就從一個(gè)fiddler應(yīng)用每次打開默認(rèn)的一個(gè)請求來學(xué)習(xí)下一個(gè)完整的HTTP請求包和響應(yīng)包:
一、http請求包

請求行
第一行分別包含:請求方法、請求地址、請求協(xié)議;我們來一一了解。
1、請求方法
“GET”是請求方法里面的一種。根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
我們可以這樣認(rèn)為:一個(gè)URL地址,它用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET,POST,PUT,DELETE就對應(yīng)著對這個(gè)資源的查,改,增,刪4個(gè)操作。
我其實(shí)測試過程中見得最多的就是GET和POST,GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息。
請求方法 ? ? ? ? ? ? ? ?備注
GET ? ?請求指定的頁面信息,請求不包含實(shí)體,并返回實(shí)體主體。
HEAD ? ?類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
POST ? ?向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件),數(shù)據(jù)被包含在請求體中,POST請求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT ? ?從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容
DELETE ? ?請求服務(wù)器刪除指定的頁面
CONNECT ? ?HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS ? ?允許客戶端查看服務(wù)器的性能
TRACE ? ?回顯服務(wù)器收到的請求,主要用于測試或診斷
2、請求地址
“https://www.fiddler2.com/UpdateCheck.aspx?isBeta=False”,其實(shí)就是URL。
基本URL包含模式(或稱協(xié)議)、服務(wù)器名稱(或IP地址)、路徑和文件名,如“協(xié)議://授權(quán)/路徑?查詢”。完整的、帶有授權(quán)部分的普通統(tǒng)一資源標(biāo)志符語法看上去如下:協(xié)議://用戶名:密碼@子域名.域名.頂級域名:端口號/目錄/文件名.文件后綴?參數(shù)=值#標(biāo)志
1)模式/協(xié)議(scheme):它告訴瀏覽器如何處理將要打開的文件。最常用的模式是超文本傳輸協(xié)議(Hypertext Transfer Protocol,縮寫為HTTP),這個(gè)協(xié)議可以用來訪問網(wǎng)絡(luò)。如“http://”表示超文本傳輸協(xié)議資源,“https://”表示用安全套接字層傳送的超文本傳輸協(xié)議,“ftp://”表示文件傳輸協(xié)議……
2)文件所在的服務(wù)器的名稱或IP地址,后面是到達(dá)這個(gè)文件的路徑和文件本身的名稱。服務(wù)器的名稱或IP地址后面有時(shí)還跟一個(gè)冒號和一個(gè)端口號。它也可以包含接觸服務(wù)器必須的用戶名稱和密碼。路徑部分包含等級結(jié)構(gòu)的路徑定義,一般來說不同部分之間以斜線(/)分隔?!?”詢問部分一般用來傳送對服務(wù)器上的數(shù)據(jù)庫進(jìn)行動(dòng)態(tài)詢問時(shí)所需要的參數(shù)。
3、請求協(xié)議
“HTTP/1.1”,指的是請求協(xié)議。下面簡單介紹三種版本的請求協(xié)議,目前無2.0版本,正在開發(fā)中。
HTTP/0.9?:只接受GET一種請求方法,沒有在通信中指定版本號,且不支持請求頭。由于該版本不支持POST方法,因此客戶端無法向服務(wù)器傳遞太多信息。
HTTP/1.0?:第一個(gè)在通信中指定的版本號,至今被廣泛采用,特別是在代理服務(wù)器中。支持上面說到的,三種請求方法: GET, POST 和 HEAD方法
HTTP/1.1?:當(dāng)前版本號,持久連接被默認(rèn)采用,并能很好地配合代理服務(wù)器工作。還支持以管道方式在同時(shí)發(fā)送多個(gè)請求,以便降低線路負(fù)載,提高傳輸速度。相對1.0版本,HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
請求消息頭
第二行以后均表示消息頭,
User-Agent:中文名為用戶代理,簡稱 UA,它是一個(gè)特殊字符串頭,使得服務(wù)器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。一些網(wǎng)站常常通過判斷 UA 來給不同的操作系統(tǒng)、不同的瀏覽器發(fā)送不同的頁面,因此可能造成某些頁面無法在某個(gè)瀏覽器中正常顯示,但通過偽裝 UA 可以繞過檢測。
Pragma:是 HTTP/1.1 之前版本的歷史遺留字段。“Pargma: no-cache”只能用在客戶端發(fā)送的請求中。客戶端會(huì)要求所有的中間服務(wù)器不返回緩存的資源。 但要整體掌握全部中間服務(wù)器使用 HTTP 協(xié)議版本確實(shí)不現(xiàn)實(shí)的。因此,發(fā)送的請求會(huì)同時(shí)含有?Cache-Control: no-cache和?Pragma: no-cache。
Host:訪問的http服務(wù)器的域名/IP 地址和端口號。在http 1.1中不能缺失host字段,如果缺失, 服務(wù)器返回400 bad request,http1.1中不能缺失host字段,但host字段可以是空值;在http 1.0中可以缺失host字段。
Accept-Language: 表示瀏覽器or客戶端所支持的語言類型;
Referer:Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁面鏈接過來的,服務(wù)器以此可以獲得一些信息用于處理。
Accept-Encoding: 瀏覽器支持的壓縮編碼。gzip,GNU zip 的縮寫,它是一個(gè) GNU 自由軟件的文件壓縮程序,也經(jīng)常用來表示 gzip 這種文件格式。deflate是同時(shí)使用了 LZ77 算法與哈夫曼編碼(Huffman Coding)的一個(gè)無損數(shù)據(jù)壓縮算法。
Connection: 表示客戶端與服務(wù)連接類型;?close表明當(dāng)前正在使用的tcp鏈接在請求處理完畢后會(huì)被斷掉。以后client再進(jìn)行新的請求時(shí)就必須創(chuàng)建新的tcp鏈接了
請求實(shí)體內(nèi)容
上圖中舉的例子,實(shí)體內(nèi)容為空行;原因是因?yàn)槔邮莋et請求,是沒有請求實(shí)體內(nèi)容的。如果是post請求,實(shí)體內(nèi)容一般格式如下:
name1=value1&name2=value2&name3=value3
二、http響應(yīng)包

響應(yīng)狀態(tài)行
包含協(xié)議版本、狀態(tài)碼、原因短語,因?yàn)榍懊嬉呀?jīng)介紹了協(xié)議版本,在此不啰嗦,主要講下狀態(tài)碼和原因短語:
用以表示網(wǎng)頁服務(wù)器HTTP響應(yīng)狀態(tài)的3位數(shù)字代碼,主要分為5類:
消息1xx(100~199,目前已經(jīng)定義的有100~102):這一類型的狀態(tài)碼,代表請求已被接受,需要繼續(xù)處理。這類響應(yīng)是臨時(shí)響應(yīng),只包含狀態(tài)行和某些可選的響應(yīng)頭信息,并以空行結(jié)束。
成功2xx(200~299,目前已經(jīng)定義的有200~207):代表請求已成功被服務(wù)器接收、理解、并接受。最常見的如:200 OK 請求已成功,請求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。
重定向3xx(300~399,目前已經(jīng)定義的有300~307):這類狀態(tài)碼代表需要客戶端采取進(jìn)一步的操作才能完成請求。通常,這些狀態(tài)碼用來重定向,后續(xù)的請求地址(重定向目標(biāo))在本次響應(yīng)的 Location 域中指明。
請求錯(cuò)誤4xx(400~499,目前已經(jīng)定義的有400~449):代表了客戶端看起來可能發(fā)生了錯(cuò)誤,妨礙了服務(wù)器的處理。除非響應(yīng)的是一個(gè) HEAD 請求,否則服務(wù)器就應(yīng)該返回一個(gè)解釋當(dāng)前錯(cuò)誤狀況的實(shí)體,以及這是臨時(shí)的還是永久性的狀況。這些狀態(tài)碼適用于任何請求方法。瀏覽器應(yīng)當(dāng)向用戶顯示任何包含在此類錯(cuò)誤響應(yīng)中的實(shí)體內(nèi)容。最常見的如:404 Not Found 請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。
服務(wù)器錯(cuò)誤5xx、6xx:服務(wù)器在處理請求的過程中有錯(cuò)誤或者異常狀態(tài)發(fā)生,也有可能是服務(wù)器意識到以當(dāng)前的軟硬件資源無法完成對請求的處理。最常見的如:500 Internal Server Error 服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,導(dǎo)致了它無法完成對請求的處理,一般來說,這個(gè)問題都會(huì)在服務(wù)器端的源代碼出現(xiàn)錯(cuò)誤時(shí)出現(xiàn)。
響應(yīng)消息頭
Cache-Control:指定請求和響應(yīng)遵循的緩存機(jī)制。
Content-Type:定義網(wǎng)絡(luò)文件的類型和網(wǎng)頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個(gè)文件
Vary:Vary頭域值指定了一些請求頭域,這些請求頭域用來決定當(dāng)緩存中存在一個(gè)響應(yīng),并且該緩存沒有過期失效,是否被允許去利用此響應(yīng)去回復(fù)后續(xù)請求而不需要重驗(yàn)證(revalidation)
Server: 這個(gè)消息頭提供所使用的Web服務(wù)器軟件的相關(guān)信息。
其他幾個(gè)字面意思能看懂,就不介紹了。
響應(yīng)實(shí)體內(nèi)容
大部分測試的平臺,響應(yīng)實(shí)體會(huì)以json格式返回,給前端處理。
未經(jīng)授權(quán),請勿轉(zhuǎn)載,謝謝!