暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

接口测试与开发实战(十九)_Requests的使用

542


Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

使用requests我们可以方便的进行发送网络请求。

requests 是Python的一个第三方工具包、需要进行自行下载才能使用。它的底层其实就是urllib、requests是urllib的高级封装版本。

官方文档

http://cn.python-requests.org/zh_CN/latest/

安装

pip install requests

检查安装

pip show requests


基础方法

请求方式

方法

描述

示例

requests.get()

用于发送get请求

发送的是查询

requests.post()

用于发送post请求

用于创建数据

requests.delete()

用于发送delete请求

用于删除数据

requests.patch()

用于发送patch请求

用于部分修改数据

requests.put()

用于发送put请求

用于修改数据

requests.head()

用于·发送head请求

不常用

requests.options()

用于发送options请求

不常用

get()


我们使用cms端的查询用户列表接口来进行演示:

import requests

url =  "http://127.0.0.1:8000/api/cms/get/userList"

# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)
print(resp)
# 输出的是一个requests的实例对象
#>>> <Response [200]>

我们可以使用它的实例对象进行一些如下操作:


response

方法

描述

示例

resp.url

获取响应的url


resp.status_code

获取请求的响应状态码


resp.headers

获取响应header


resp.elapsed

获取请求的响应时间


resp.encoding

获取响应的编码格式


resp.is_redirect

是否为重定向


resp.is_permanent_redirect

是否为永久重定向


resp.ok

是否响应成功


resp.text

获取响应文本

字符串

resp.content

获取响应内容

字节类型

resp.json()

获取响应数据以反序列化形式返回

字典类型 dict

import requests

url =  "http://127.0.0.1:8000/api/cms/get/userList"

# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)

print("url===>",resp.url)
print("status_code===>",resp.status_code)
print("headers===>",resp.headers)
print("elapsed===>",resp.elapsed)
print("encoding===>",resp.encoding)
print("is_redirect===>",resp.is_redirect)
print("is_permanent_redirect===>",resp.is_permanent_redirect)
print("ok===>",resp.ok)
print("text===>",resp.text)
print("content===>",resp.content)
print("json===>",resp.json())

url===> http://127.0.0.1:8000/api/cms/get/userList
status_code===> 200
headers===> {'Date''Wed, 11 Aug 2021 10:14:55 GMT''Server''WSGIServer/0.2 CPython/3.9.2''Content-Type''application/json''Allow''GET, HEAD, OPTIONS''X-Frame-Options''DENY''Content-Length''59''Vary''Cookie''X-Content-Type-Options''nosniff''Referrer-Policy''same-origin'}
elapsed===> 0:00:00.002756
encoding===> utf-8
is_redirect===> False
is_permanent_redirect===> False
ok===> True
text===> {"code":1,"message":"Token不能为空","messageCode":2005}
content===> b'{"code":1,"message":"Token\xe4\xb8\x8d\xe8\x83\xbd\xe4\xb8\xba\xe7\xa9\xba","messageCode":2005}'
json===> {'code'1'message''Token不能为空''messageCode'2005}

request

方法

描述

示例

resp.request.url

获取请求的url


resp.request.headers

获取请求的headers


resp.request.body

获取请求的body


resp.request.method

获取请求的方法


import requests

url =  "http://127.0.0.1:8000/api/cms/get/userList"

# url进行传入需要发起http请求的资源路径
resp = requests.get(url=url)

print("url===>",resp.request.url)
print("headers===>",resp.request.headers)
print("body===>",resp.request.body)
print("method===>",resp.request.method)

url===> http://127.0.0.1:8000/api/cms/get/userList
headers===> {'User-Agent''python-requests/2.26.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}
body===> None
method===> GET

请求参数

我们请求用户查询接口时返回给我们的是我们需要传入一个token参数

我们可以使用 params 参数进行传递参数给接口、需要有key=val

import requests

url =  "http://127.0.0.1:8000/api/cms/get/userList"

# url进行传入需要发起http请求的资源路径
data = {"token":""}
resp = requests.get(url=url,params=data)

print(resp.json())



我们已经看到后台终端已经接收到了一个请求参数为token的响应、但没有值我们传递的时候本身就是没有给值所以这是正常的、token需要进行登录我们下面讲解post请求使用在进行登录接口演示


post()

请求与响应与get方法一样

这里我们使用登录接口进行演示

post 传递的参数都是在body里面因此我们需要使用 data参数进行做post请求的数据传递

import requests

url =  "http://127.0.0.1:8000/api/cms/login/"

# url进行传入需要发起http请求的资源路径
data = {
    "username":"admin",
    "password":"admin"
}
resp = requests.post(url=url,data=data)

print(resp.json())


{
  'code'0,
  'data': {
    'id''1',
    'token''MTYyODY5NTg3NC4zNjMzNzc6NTExODk2NmQzZGU4NzM2M2I1ZjczZDM2MzE1MmI0YmZjMzQyODg2OQ==',
    'userInfo': [
      {
        'username''admin',
        'nickname''1',
        'sex'0,
        'age'0,
        'phone''123456',
        'role''admin',
        'introduce'None,
        'signin'None,
        'email'None,
        'tag'None,
        'createTime'None,
        'updateTime'None,
        'deleteTime'None,
        'recentlyLoginTime''1628677874',
        'recentlyLoginSite'None,
        'ip''26.26.26.1',
        'status'None,
        'isDelete'None,
        'isShow'None,
        'create_by'None,
        'picturePath'None
      }
    ]
  },
  'messageCode'2000
}

好我们拿到了登录的数据、进行对数据处理我们要拿到token的值

import requests

# url =  "http://127.0.0.1:8000/api/cms/get/userList"
url =  "http://127.0.0.1:8000/api/cms/login/"

# url进行传入需要发起http请求的资源路径
data = {
    "username":"admin",
    "password":"123456"
}
resp = requests.post(url=url,data=data).json()

# 因为已经反序列化了无需去处理json数据格式转换
print(resp["data"]["token"])

>>> MTYyODY5NjE3My45MDIyNDI6MDMyMThkM2ViNmE2Y2ZlZDY3MTEwYWY5NmI3Y2YwNjc1NzcxYjc1Yw==

拿到token了我们继续回到get请求方法、查询用户列表接口

url =  "http://127.0.0.1:8000/api/cms/get/userList"
data = {
    "Token":resp["data"]["token"]
}
resp = requests.get(url=url,params=data).json()
print(resp)

>>> {'code'1'message''Token不能为空''messageCode'2005}

我们已经看到其实已经传递token给后端接口了、为什么还是提示我们token为空?

其实我们可以去看看接口token的参数类型就知道了、发现是个header、需要是请求header那我们看到不能使用参数的形式给后台了。


需要使用 headers参数将数据传递进去

url =  "http://127.0.0.1:8000/api/cms/get/userList"
data = {
    "Token":resp["data"]["token"]
}



resp = requests.get(url=url,headers=data).json()
print(resp)

请求正常了




cookies 操作

方法

描述

示例

response.cookies.get()

获取一个cookie值


response.cookies.keys()

获取所有cookie的name


response.cookies.values()

获取所有cookie的name对应的value


response.cookies.get_dict()

获取一个完整的cookie键值字典


RequestsCookieJar.set_cookie()

写入一个cookie



由于我们的接口没有涉及到cookie、我们首先来写入一个cookie

resp = requests.post(url=url,data=data)
print(resp.cookies.set("app",1168))
print(resp.cookies.get("app"))

>>> <Cookie app=1168 for />
>>> 1168


# 获取所有键
print(resp.cookies.keys())
>>> ['app']


# get 按照key获取对应的值
print(resp.cookies.get("app"))
>>> {'app'1168}


# get_dict 获取字典类型
print(resp.cookies.set("app",1168))
print(resp.cookies.set("data","接口自动化测试"))
print(resp.cookies.values())
>>> [1168'接口自动化测试']



Session 对象

Session 是一个线程安全的连接池, 它的作用是维护一个cookie集合, 帮你保留你所有请求痕迹(即所有服务器set-cookie的数据), 通过这种方式可以让你无间断地进行数据交互(而不是每个请求都需要单独认证一次!).

Session 的使用方法跟requests基本保持一致, 同时支持多线程并发请求, 因为它是线程安全的连接池(会话池)


from requests import sessions
session = sessions.Session()

url =  "http://127.0.0.1:8000/api/cms/get/userList"
header = {
"Token""MTYyODg0MjU0MC4xMzM5NTQ1OjA5NWUzMTRkM2ExNTk1ZTMwNmZkNWZjYTM3MzZjYTgwNTBhYWM0NWU="
}
response = session.get(url,headers=header)
print(response.json())

其他具体操作与requests一样。。。



二进制文件下载与上传

使用 Response.iter_content 将会处理大量你直接使用 Response.raw 不得不处理的。当流下载时,上面是优先推荐的获取内容方式。Note that chunk_size can be freely adjusted to a number that may better fit your use cases.



我们找一个在线图片路径

url =  "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Felement_origin_min_pic%2F16%2F07%2F06%2F17577cd55945262.jpg%21r650&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1631417225&t=a7b4d26d5cee273a0e5951e8e0580e97"
response = requests.get(url=url)

# 保存文件的文件夹路径
savefile = r"F:\code\stackCMSAPI"
# 文件名称
filename = "test01.png"
# 拼接路径
file = os.path.join(savefile,filename)
print(file)

# wb w写入 b二进制 wb写入二进制文件
with open(file, 'wb'as fd:
    for chunk in response.iter_content():
        fd.write(chunk)




文件上传

url = "http://127.0.0.1:8000/api/cms/uplaod"
response = requests.post(url=url, files={'file': open(r'F:\code\stackCMSAPI\test01.png''rb')})
print(response.json())

上传成功


基本上requests基础就这些、其他的不再细讲、可以自己看官方文档进行练习、这些基础基本上可以进行接口的测试。如果遇到了问题再来补充。。。



文章转载自测试前沿布道者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论