文章目录
- 前言
- Requests库是什么
- 为什么要用Requests库进行接口测试
- 安装Requests库
- Requests库使用
- 发送GET请求
- 发送带查询参数的GET请求
- 响应内容格式
- 添加请求头信息
- 发送一个POST请求
- 查看响应内容
- 断言
- 请求超时
- Cookie与Session模拟登录
- 参考目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
本文仅对Requests库做了简单的介绍,具体使用和更多内容请查看官网文档,如果还有具体的使用问题可查询更多其他资料,也欢迎在评论区留言。
Requests库是什么
Requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests官方中文文档
为什么要用Requests库进行接口测试
之前所学的Postman和Jmeter工具只需要通过点击即可进行接口测试,操作简单方便,结果直观。但相比于代码实现仍有一定的缺点:
- 工具读取测试数据不灵活(无法直接读取或存储Json格式数据)
- 不方便测试加密数据
- 编写复杂的业务逻辑与复杂断言脚本较为麻烦
安装Requests库
在安装了python的基础上(python一般会带有pip包),在命令提示符(CMD)中输入即可。
$ pip install requests
获得源码
如果想要获取Requests的源代码,可以从github上的公共版本库获取到代码。
git clone git://github.com/kennethreitz/requests.git
Requests库使用
发送GET请求
#1、导入requuests包
import requests
#2、发送get请求
r = requests.get("http://www.baidu.com")
#3、打印结果
print(r)
print(r.status_code)
print(r.headers)
print(r.url)
print(r.cookies)
print(r.text)尝试获取百度网页的信息。
>>> r = requests.get("http://www.baidu.com")
返回一个名为 r 的 Response 响应对象。我们可以从这个对象中获取所有我们想要的信息。
发送带查询参数的GET请求
为 URL 的查询字符串(query string)传递某种数据。如果你是手工构建 URL,那么数据会以键值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:
payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
r = requests.get(“http://httpbin.org/get”, params=payload)
通过打印输出该 URL,你能看到 URL 已被正确编码:
print(r.url)
http://httpbin.org/get?key2=value2&key1=value1
注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。
你还可以将一个列表作为值传入:
payload = {‘key1’: ‘value1’, ‘key2’: [‘value2’, ‘value3’]}
r = requests.get(‘http://httpbin.org/get’, params=payload)
print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
响应内容格式
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被解码,可以使用 r.encoding 属性来改变它:
r.encoding = 'utf-8‘
如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding 的新值。
比如 HTTP 和 XML 自身可以指定编码。这样的话,你应该使用 r.content 来找到编码,然后设置 r.encoding 为相应的编码。这样就能使用正确的编码解析 r.text 了。
你也能以字节的方式访问请求响应体,对于非文本请求:r.content
Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:r.json()
获取来自服务器的原始套接字响应:r.raw
添加请求头信息
为请求添加 HTTP 头部,传递一个 dict 给 headers 参数就可以了。
url = ‘https://api.github.com/some/endpoint’
headers = {‘user-agent’: ‘my-app/0.0.1’}
r = requests.get(url, headers=headers)
注意: 添加的header 的优先级低于某些特定的信息源,例如:
如果在 .netrc 中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了 auth= 参数,.netrc的设置就无效了。
如果被重定向到别的主机,授权 header 就会被删除。
代理授权 header 会被 URL 中提供的代理身份覆盖掉。
更进一步讲,Requests 不会基于添加 header 的具体情况改变自己的行为。只不过在最后的请求中,所有的 header 信息都会被传递进去。
发送一个POST请求
发送一些编码为表单形式的数据给服务器,只需传递一个字典给 data 参数。数据字典在发出请求时会自动编码为表单形式:
payload = {‘key1’: ‘value1’, ‘key2’: ‘value2’}
r = requests.post(“http://httpbin.org/post”, data=payload)
print(r.text)
还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候,这种方式尤其有效:
payload = ((‘key1’, ‘value1’), (‘key1’, ‘value2’))
r = requests.post(‘http://httpbin.org/post’, data=payload)
print(r.text)
data 参数接受编码为 JSON 格式的数据,但要先将数据进行转换
import json
url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
r = requests.post(url, data=json.dumps(payload))
还可以使用 json 参数直接传递,然后它就会被自动编码
url = ‘https://api.github.com/some/endpoint’
payload = {‘some’: ‘data’}
r = requests.post(url, json=payload)
POST一个文件
url = ‘http://httpbin.org/post’
files = {‘file’: open(‘report.xls’, ‘rb’)}
r = requests.post(url, files=files)
关于上传文件的高级用法请参考官方文档高级用法一节。
查看响应内容
更多响应内容请查看官方文档
断言
接收返回的响应结果后,我们可以使用assert关键字来判断返回的状态码是否为200:
assert response.status_code == 200
可以对返回的内容进行断言。例如,我们可以使用assert关键字来判断返回的JSON中的某个字段的值是否符合预期:
assert response.json()[‘field’] == ‘value’
如果实际结果不符合预期,断言会失败,程序会抛出异常。
除了使用assert关键字,我们还可以结合unittest框架中的断言方法来进行断言处理。
首先,我们需要导入unittest库:
import unittest
例如,我们可以使用assertEqual()方法来判断两个值是否相等:
class TestAPI(unittest.TestCase):def test_response_status_code(self):response = requests.get(url)self.assertEqual(response.status_code, 200)
请求超时
为防止服务器不能及时响应,大部分发至服务器的请求都应该带着 timeout 参数。在默认情况下,除非显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。
requests 库将一个请求超时分成了两部分:
连接超时指的是在你的客户端实现到远端机器端口的连接时(对应的是connect()
_),Request 会等待的秒数。
一旦你的客户端连接到了服务器并且发送了 HTTP 请求,读取超时指的就是客户端等待服务器发送请求的时间。
如下所示:只对timeout设置了一个值
r = requests.get(‘https://github.com’, timeout=5)
这一 timeout 值将会用作 connect 和 read 二者的和。
如果要分别制定,就传入一个元组:
r = requests.get(‘https://github.com’, timeout=(3.05, 27))
Cookie与Session模拟登录
Cookie:利用headers参数,将抓包获取的 Cookie 放到 headers 参数中
headers={"Cookie":"手动抓取的 Cookie ","User-Agent":"" }html=request.get(url=url,headers=header).text
Session:
import requests
def run():headers = {'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'}data = {'username': 'xxxx','password': 'xxxx'}# 实例化 session 对象session = requests.session()# 使用session发送请求,登录网站,返回的cookie保存其中session.post('https://passport.baidu.com/center', headers=headers, data=data)# 使用由session对象请求需要登录才能访问的页面,得到信息返回 r = session.get(url, headers=headers)with open('csdn-1.html', 'w', encoding='utf-8') as f:f.write(r.content.decode())if __name__ == '__main__':run()
本文仅对Requests库做了简单的介绍,具体使用和更多内容请查看官网文档,如果还有具体的使用问题可查询更多其他资料,也欢迎在评论区留言。
参考目录
https://requests.readthedocs.io/projects/cn/zh-cn/latest/
https://www.bilibili.com/video/BV1uz411q7Pg
https://www.bilibili.com/video/BV1pT4y1A7dV
https://blog.csdn.net/sallyyellow/article/details/129878909
https://blog.csdn.net/Ghjkku/article/details/127281184