python接口测试之401错误的分析和解决(十六)

作者 无涯

     在接口的测试中,经常会遇到客户端向服务端发送一个请求,服务端返回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

  通过一个案例来分析在HTTP的请求中403错误的解决以及HTTP的状态码中403怎么理解,见发送一个请求后,返回的状态码,见如下的信息:

技术分享图片

 

在如上的的截图中,可以看到返回了HTTP状态码是403,那么如何这个过程了,在HTTP的状态码中,403 Forbidden表示对请求资源的访问被拒绝,而且服务端没有给出为什么拒绝的理由,比如我们在浏览器访问如上链接,见访问后服务端的回应:

{
  "error": "Unauthorized access"
}

见General的内容:

Request URL:http://localhost:5000/hotel/username/
Request Method:GET
Status Code:403 FORBIDDEN
Remote Address:127.0.0.1:5000

见Response Headers部分的内容:

Content-Length:37
Content-Type:application/json
Date:Sun, 01 Apr 2018 14:04:36 GMT
Server:Werkzeug/0.11.13 Python/2.7.12
WWW-Authenticate:Basic realm="Authentication Required"

在如上的信息中,首部字段WWW-Authenticate用于HTTP访问认证,它会告诉客户端用于请求URI所指定资源的认证方案(Basic或者是Digest)。显示Basic,那么我们得到认证方案使用的是Basic Auth,在使用postman请求的时候需要鉴权,鉴权后再次访问,HTTP的状态码不再是403,而是200。见鉴权后的请求结果:

技术分享图片

 

在请求中,headers中必须带上Authorization,要不就会再次出现403的错误。 

        下面实现使用python语言来处理403的错误,以及请求的时候带上鉴权,见实现的代码:

#!/usr/bin/env python 
#-*-coding:utf-8-*-

import  requests

r=requests.get(
   url=http://localhost:5000/hotel/username/,
   auth=(wuya,admin))
print r.text
见执行如上代码后,打印的结果:

{
  "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": "\u674e\u56db", 
      "vpl": "\u4eacAJ3585"
    }
  ]
}

 

文章来自:https://www.cnblogs.com/jason89/p/9033940.html
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3