在正式進入接口測試之前,我們來回憶和補充一下關於接口的基礎知識,這將為我們后面做接口測試奠定基礎。好了,廢話不多說,直接上干貨。
1、接口的分類
- 硬件接口:指的是兩個硬件設備之間的連接方式(比如:鼠標和電腦之間通過USB接口進行連接);
- 軟件接口:簡單來書就是軟件程序之間數據交互的通道。
2、軟件接口分類
- 程序內部接口:指的是客戶端與服務器的接口,用來實現客戶端和服務器間的數據傳遞;
- 外部接口:外部接口常見的例子就是通過第三方登錄、第三方支付等,通過調用第三方的忌口並返回當前的系統。
1)常見的接口協議
- WebService接口:使用soap協議通過http傳輸,請求報文和返回報文都是xml格式的,常用的測試工具有soapUI;
- http協議接口:目前使用最廣泛,使用http協議來傳輸數據,常見的請求方法有:get、post等,常用的測試工具有postman、jmeter等。
2)什么是接口測試
接口測試本質是基於某種協議,發送一個請求給服務器,然后服務器返回一個響應數據,通過對響應數據的分析,判斷是否與我們預期的返回一致,從而驗證功能是否正確,這就是接口測試。
那么,客戶端到底是如何向服務器發送請求的呢?
3、HTTP協議解讀
1)初識HTTP協議
HTTP協議:超文本傳輸協議(HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的HTML文件都必須遵守這個標准。設計HTTP最初的目的就是為了提供一種發布和接受HTML頁面的方法。
HTTPS協議:(HyperText Transfer Protocol over Secure Socket Layer)簡單講就是HTTP協議的安全版,在HTTP協議下加入了SSL層。
SSL:(Secure Socket Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡連接進行加密,保障在Internet上數據傳輸的安全。
- HTTP的默認端口:80
- HTTPS的默認端口:443
- 發送郵件:25
- 加密郵件端口:465
2)HTTP請求的過程
客戶端:PC端應用程序、瀏覽器、APP、小程序、爬蟲(代碼)
HTTP通信由兩部分組成:客戶端請求信息 和 服務器響應信息。

- 當用戶在瀏覽器輸入一個URL並按回車鍵之后,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分為“GET”和“POST”兩種方法。
- 當我們在瀏覽器輸入“http://www.baidu.com”時,瀏覽器會發送一個Request請求去獲取“http://www.baidu.com”的html文件,服務器把Response文件對象發送回給瀏覽器。
- 瀏覽器分析Response中的html,發現其中引用了很多文件,比如Image文件、CSS文件、JS文件。瀏覽器對自動再去發送Request去獲取圖片、CSS文件或者JS文件。
- 當所有的文件都下載成功后,網頁會根據HTML語法結構,完整的顯示出來。
3)HTTP請求信息
在瀏覽器輸入URL地址訪問某個網站,發送一個HTTP請求到服務器的請求消息,包含以下格式:
請求行:
- 請求行以一個方法符號開頭,后面跟着請求URI和協議的版本,以CRLF作為結尾。
- 請求行以空格分隔。除了作為結尾的CRLF外,不允許出現單獨的CR或LF字符,格式如下:Method Request-URI HTTP-Version CRLF。Method表示請求的方法,Request-URI是一個統一資源標識符,標識了要請求的資源,HTTP-Version表示請求的HTTP協議版本,CRLF表示回車換行。例如:GET /test.html HTTP/1.1 (CRLF)
請求頭部(request headers):
- HOST(主機和端口號):對應網址URL中的Web名稱和端口號(域名);
- Connection(鏈接類型):表示客戶端與服務器的鏈接類型:keep-alive表示長鏈接(HTTP/1.1使用keep-alive為默認值);
- Upgrade-Insecure-Requests(升級為HTTPS請求):升級不安全的請求,意思是會在加載HTTP資源是自動替換成https請求,讓瀏覽器不再顯示https頁面中的http請求警報。
- User-Agent(瀏覽器名稱):是客戶瀏覽器的名稱。
- Accept(傳輸文件類型):指瀏覽器或者其他客戶端可以接受的文件類型,服務器可以根據它判斷並返回適當的文件格式:
- Accept:text/html,application/xhtml+xml;q=0.9,image/*;q=0.8:表示瀏覽器支持的文本類型分別為 html文本、xhtml和xmlendanger、所有的格式圖像資源;
- Text:文本信息,可以是多種字符集的和或者多種格式的;
- Application:用於傳輸應用程序數據或者二進制數據;
- q:權重系數,范圍為1 >= q >=0,q值越大,越靠前。默認為1,按從左到右排序順序,q值為0,表示瀏覽器不接受此類型。
- Referer(頁面跳轉處):表示請求的網頁來自哪個URL,用戶是從該Referer頁面訪問到該頁面的。這個屬性可以用來追蹤Web請求來自哪個頁面,是從什么網站來的等。
- Application-Encoding(文件編解碼格式):指出瀏覽器可以接受的編碼方式。編碼方式不同於文件格式,它是為了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應之后會先解碼,然后再檢查文件格式,許多情況下這可以節省大量的下載時間;
- Accept-Language(語言種類):指出瀏覽器可以接受的語言種類,如en或en-us表示英語,zh或者zh-cn表示中文,當服務器能夠提供一種以上的語言版本時要用到。
- Cache-Control:max-age= 0:明確表示不會緩存服務器資源;
- Accpet-Charset(字符編碼):指出瀏覽器可以接受的字符編碼。如果在請求消息中沒有設置這個域,缺省是任何字符集都可以接受;
- Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,用以記載和服務器相關的用戶信息,也可以用來實現會話功能,后面我們會詳細介紹;
- Content-Type(POST數據類型):POST請求里用來表示的內容類型。
4)HTTP響應數據
服務器接收到請求后,返回的HTTP響應也由4部分組成,分別是:
狀態行:一個數字與文字組成的狀態碼,用來顯示請求成功失敗信息,如:Status Code: 200 OK
消息報頭:響應頭與請求頭包含許多有用信息,例如:服務器類型、日期時間、內容類型和長度等。
服務器端的響應Header(response header)
- Connection:keep-alive( 針對該連接所預期的選項)
- Content-Disposition:inline;filename=f.txt( 對已知MIME類型資源的描述,瀏覽器可以根據這個響應頭決定是對返回資源的動作,如:將其下載或是打開。)
- Content-Type:application/json;charset=UTF-8( 當前內容的
MIME類型) - Date:Wed, 07 Nov 2018 09:33:39 GMT*( 此條消息被發送時的日期和時間(以RFC 7231中定義的"HTTP日期"格式來表示))
- Server:Tengine( 服務器的名稱)
- Transfer-Encoding: chunked( 用表示實體傳輸給用戶的編碼形式。包括:
chunked、compress、deflate、gzip、identity。)
空行:用來分割
響應體:即響應正文。

5)HTTP響應狀態碼
1xx(臨時響應) 表示臨時響應並需要請求者繼續執行操作的狀態代碼。
100 (繼續) 請求者應當繼續提出請求。 服務器返回此代碼表示已收到請求的第一部分,正在等待其余部分。
101 (切換協議) 請求者已要求服務器切換協議,服務器已確認並准備切換。
2XX (成功) 都表示服務器成功處理了請求的狀態代碼,說明網頁可以正常訪問。
200(成功) 服務器已成功處理了請求。通常,這表示服務器提供了請求的網頁。
201(已創建) 請求成功且服務器已創建了新的資源。
202(已接受) 服務器已接受了請求,但尚未對其進行處理。
203(非授權信息) 服務器已成功處理了請求,但返回了可能來自另一來源的信息。
204(無內容) 服務器成功處理了請求,但未返回任何內容。
205(重置內容) 服務器成功處理了請求,但未返回任何內容。與 204 響應不同,此響應要求請求者重置文檔視圖(例如清除表單內容以輸入新內容)。
206(部分內容) 服務器成功處理了部分 GET 請求。
3xx (重定向) 表示要完成請求,需要進一步操作。 通常,這些狀態代碼用來重定向。
300 (多種選擇) 針對請求,服務器可執行多種操作。 服務器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
301 (永久移動) 請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302 (臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
303 (查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
304 (未修改) 自從上次請求后,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
305 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果服務器返回此響應,還表示請求者應使用代理。
307 (臨時重定向) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
4xx(請求錯誤) 這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。
400 (錯誤請求) 服務器不理解請求的語法。
401 (未授權) 請求要求身份驗證。 對於需要登錄的網頁,服務器可能返回此響應。
403 (禁止) 服務器拒絕請求。
404 (未找到) 服務器找不到請求的網頁。
405 (方法禁用) 禁用請求中指定的方法。
406 (不接受) 無法使用請求的內容特性響應請求的網頁。
407 (需要代理授權) 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。
408 (請求超時) 服務器等候請求時發生超時。
409 (沖突) 服務器在完成請求時發生沖突。 服務器必須在響應中包含有關沖突的信息。
410 (已刪除) 如果請求的資源已永久刪除,服務器就會返回此響應。
411 (需要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。
412 (未滿足前提條件) 服務器未滿足請求者在請求中設置的其中一個前提條件。
413 (請求實體過大) 服務器無法處理請求,因為請求實體過大,超出服務器的處理能力。
414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,服務器無法處理。
415 (不支持的媒體類型) 請求的格式不受請求頁面的支持。
416 (請求范圍不符合要求) 如果頁面無法提供請求的范圍,則服務器會返回此狀態代碼。
417 (未滿足期望值) 服務器未滿足”期望”請求標頭字段的要求。
5xx(服務器錯誤) 這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是服務器本身的錯誤,而不是請求出錯。
500 (服務器內部錯誤) 服務器遇到錯誤,無法完成請求。
501 (尚未實施) 服務器不具備完成請求的功能。 例如,服務器無法識別請求方法時可能會返回此代碼。
502 (錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。
503 (服務不可用) 服務器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。
504 (網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
505 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。
6)HTTP請求方法
根據HTTP標准,HTTP請求可以使用多種請求方法:

HTTP請求常用的GET和POST兩種方法:
- GET是從服務器上獲取數據,POST是向服務器傳送數據;
- GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來返回響應內容,即 GET請求的參數是URL的一部分。例如:http://www.baidu.com?username=cactus&userid=666;
- POST請求參數在請求體中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向服務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等),請求的參數存在“Content-Type”消息頭里,指明該消息體的媒體類型和編碼。
4、鑒權、授權
我們先來思考一個問題,瀏覽器登錄了某些網站(比如騰訊視頻),下次訪問為什么不要登錄?這其實就是鑒權和授權的原因,下面我們將為大家詳細介紹鑒權和授權,相信大家看完之后會對鑒權和授權有更深的了解。
用兩句話來理解鑒權和授權:
- 授權:相當於給一個通行證;
- 鑒權:鑒定是否有權限訪問(判斷有沒有通行證)。
1)Cookies和session
首先我們用一張圖來表示它們之間的關系:

cookie:
- cookie是在HTTP協議下,服務器或腳本可以使用用戶信息的一種方式。cookie是由web服務器保存在用戶瀏覽器(客戶端)上的小文本文件,它可以包含有關用戶的信息。無論何時用戶訪問到服務器,都會帶上該服務器的cookie信息。
- 一般cookie都是有有效期的,cookie只在瀏覽器上保存一段規定的時間,一旦超過規定得到時間,該cookie就會被系統清除。
session:
- session將數據存儲在服務器中,服務器會為每一個用戶創建一條session,用戶訪問服務器的時候需要拿着session去表明自己的身份。
- session的實現是基於cookie,session需要借助於cookie來存儲sessionID。
token和session的區別:
- token是需要手動傳到參數當中的。session派發的session_id會自動存儲在瀏覽器的cookie中,在下次訪問這個網站的時候,會自動帶上;
- session_id會存到服務器,需要消耗資源,在瀏覽器傳輸過來后要進行查詢,也會消耗資源;
- token不需要存儲的服務器,服務器會解密,消耗的是cpu;
- token可以跨平台、跨域。session是和域名綁定的。
