在接口的測試中,經常會遇到客戶端向服務端發送一個請求,服務端返回401的錯誤,那么今天本文章就來說明在接口測試中如何分析以及解決該問題。
我們知道在HTTP返回的狀態碼中,401錯誤表示的是被請求的頁面需要用戶名和密碼。401的錯誤詳細的可以描述為:客戶端發送請求抖到服務端,頁面需要驗證服務端會返回401的錯誤,見如下的錯誤信息:
401 UNAUTHORIZED
Headers
Content-Type: application/jsonWWW-Authenticate: Basic realm="Authentication Required"Content-Length: 37Server: Werkzeug/0.11.13 Python/2.7.12Date: Wed, 14 Mar 2018 14:57:24 GMT
{ "error": "Unauthorized access"}
依據錯誤的信息可以獲取到,發送的請求需要有通過HTTP的認證的認證信息,如果在瀏覽器中訪問,會直接彈出需要輸入用戶名和密碼的彈出框,見截圖:
那么在HTTP的認證中,經常會被使用到認證方式分別是BASIC認證和DIGEST認證,我們具體來看BASIC的認證方式是一種流行,行業標准的身份驗證方式,是在HTTP1.0中指定。主要是指使用用戶ID和密碼使用Base64編碼標准進行編碼,並通過HTTP進行傳屬,只有當用戶ID和密碼有效時,服務器才允許用戶訪問。
在我們的案例中,使用的認證方式是BASIC的認證方式,那么在客戶端向服務端發送請求的時候,帶上用戶信息,再次請求可以成功。在postman中的Basic auth指定用戶名和密碼,見請求成功的信息:
Response (20.345s) - http://localhost:5000/hotel/username/
200 OK
Headers
Content-Type: application/jsonContent-Length: 308Server: Werkzeug/0.11.13 Python/2.7.12Date: Wed, 14 Mar 2018 15:09:33 GMT
{ "datas": [ { "check in": "2018-03-08 08:20:10", "check out": "2018-03-09 14:00:00", "identity card": "23012919950425723X", "phone": "13484545190", "room number": "1104", "userid": 1, "username": "李四", "vpl": "京AJ3585" } ] }
當然我們也可以使用requests輕松的解決這部分,見實現的代碼:
#!/usr/bin/env python #-*-coding:utf-8-*- import requests r=requests.get( 'http://localhost:5000/hotel/username/', auth=('wuya','admin')) print r.text
或者直接指定HTTPBasic,見修改后的代碼:
#!/usr/bin/env python #-*-coding:utf-8-*- import requests from requests.auth import HTTPBasicAuth r=requests.get( 'http://localhost:5000/hotel/username/', auth=HTTPBasicAuth('wuya','admin')) print r.text