前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python接口测试之Requests

Python接口测试之Requests

作者头像
无涯WuYa
发布2019-03-04 10:53:39
5240
发布2019-03-04 10:53:39
举报

众所周知,Requests是Python语言的第三方的库,专门用于发送HTTP请求。在Python语言中,虽然提供了urllib2和urllib的库,但是相比较而言,Requests任然是实现接口测试最好的选择,因为它是用起来更加简便。

在这里重点介绍Requests中POST请求方法中请求参数data和请求参数json的区别,以及在实际工作中应用时的注意事项。见POST请求的源码:

代码语言:javascript
复制
def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.
    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """
    return request('post', url, data=data, json=json, **kwargs)

注释:在如上源码中,可以得到的信息是在POST请求方法中,除了请求地址URL外,请求参数到底是该使用data还是使用json,不是很好的区分,并且这两个参数都给了默认值None。参数**kwargs指的是动态请求的参数,在这里可以是headers,timeout,cookie,file等参数。继续看源码部分,在注释中可以得到JSON参数主要用于发送可序列化的Python对象,主要应用在请求头中Content-Type是application/json中。

当然,这里结合具体的案例来说明使用JSON参数的注意实现,案例中输入错误的登录账号信息,点击登录按钮,服务端返回了响应数据如下图所示:

再见请求的数据和请求头的信息,如下图所示:

下面使用Requests库中POST请求来实现该过程,在如上的请求头中可以看到,它的请求数据格式是JSON格式的字符串,那么在POST请求中请求参数是JSON,实现的源码如下:

代码语言:javascript
复制
#!/usr/bin/env python
#coding:utf-8 
#Author:WuYa
import  requests
import json


def getHeaders():
   headers={
      'Content-Type':'application/json;charset=UTF-8',
      'Parkingwang-Client-Source':'ParkingWangAPIClientWeb'}
   return headers

def login():
   r=requests.post(
      url='http://116.***.***.145:****/v5/login',
      json={"source":"common","password":""},
      headers=getHeaders())
   print(json.dumps(r.json(),indent=False,ensure_ascii=False))

if __name__ == '__main__':
    login()

执行后,显示结果如下图所示:

可能有人会有疑问,那请求参数从JSON修改为data会怎么样,我们可以试试,修改下代码,把请求参数从json修改为data,看它执行输出的结果如下图所示:

实际业务状态码应该返回10001,但是由于使用不正确,返回了501,所以这里要特别的注意,如果一定要使用data的请求参数,如果请求参数是application/json,就需要对请求的参数做序列化的处理,把字典类型的数据转为json格式的字符串类型,对如上代码进行序列化的处理,执行就正确,如下图所示:

下面再结合一些案例来看看这部分的区别,也是登录的案例,账号错误,发送请求后,服务端返回的信息为:

{"result":{"code":"21101", "message":"手机号或密码错误", "data":{}}}

请求信息如图所示:

可以看到它的Content-Type是application/x-www-form-urlencoded; charset=UTF-8,并不是application/json。那么针对的请求头,它的请求参数是data,如果是json,反而不对,先看正确的代码如下:

代码语言:javascript
复制
#!/usr/bin/env python
#coding:utf-8 
#Author:WuYa
import  requests
import json
import  urllib3

urllib3.disable_warnings()


def getHeaders():
   headers={
      'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'}
   return headers

def login():
   r=requests.post(
      url='https://dig.chouti.com/login',
      data={'phone':'8613484545195','password':'asdfghert','oneMonth':'1'},
      headers=getHeaders(),
      verify=False)
   print(json.dumps(r.json(),indent=True,ensure_ascii=False))

if __name__ == '__main__':
    login()

执行后的结果如图所示:

如果把请求参数从data修改为json,错误的就很离谱,见执行的结果:

今晚就更新到这,如您对我的课程感兴趣,扫描如下二维码可购买,谢谢您!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档