您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

requests 让接口测试如此简单

时间:2021-12-01 13:55:27  来源:  作者:柠檬班软件测试
requests 让接口测试如此简单

 

requests

一、简介

使用 Python 做自动化接口测试需要用代码发送 http 请求。requests 是 Python 语言里网络请求库中最好用的,没有之一。

requests 库有完善详尽的中文版官方文档:
https://requests.readthedocs.io/zh_CN/latest/

作者

Requests 的作者 Kenneth Reitz 是一个富有传奇色彩的人物。

Kenneth Reitz 在有着“云服务鼻祖”之称的 Heroku 公司,28 岁时就担任了 Python 语言的总架构师。他做了什么呢?随便列几个项目名称: requests、python-guide、pipenv、legit、autoenv,当然它也给 Python 界很多知名的开源项目贡献了代码,比如 Flask。大神级程序员,据说其身价高达 5 亿美元。

二、使用

1. 发起请求

1.1 请求方法

每一个请求方法都有一个对应的 API,比如 GET 请求就可以使用 get() 方法:

  import requests
resp = requests.get('https://www.baidu.com')

而 POST 请求就可以使用 post() 方法,并且将需要提交的数据传递给 data 参数即可:

  resp = requests.post('http://httpbin.org/post', data = {'key':'value'})

而其他的请求类型,都有各自对应的方法:

  requests.put('http://httpbin.org/put', data = {'key':'value'})
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

非常的简单直观明了。

1.2 传递 URL 参数

传递 URL 参数不需要去拼接 URL,而是简单的,构造一个字典,并在请求时将其传递给 params 参数:

  import requests
params = {'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)

此时,查看请求的 URL,则可以看到 URL 已经构造正确了:

  print(resp.url)

http://httpbin.org/get?key1=value1&key2=value2
并且,有时候我们会遇到相同的 url 参数名,但有不同的值,而 python 的字典又不支持键的重名,那么我们可以把键的值用列表表示:

  params = {'key1': 'value1', 'key2': ['value2', 'value3']}
resp = requests.get('http://httpbin.org/get', params=params)
print(resp.url)

http://httpbin.org/get?key1=value1&key2=value2&key2=value3
注:http://httpbin.org 是 Kenneth Reitz 搭建的为测试 http 服务而写的项目

1.3 传递表单参数

通常,你想要发送一些编码为表单形式的数据——非常像一个 html 表单。

要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

  resp = requests.post('http://httpbin.org/post', data = {'key':'value'})
  resp.json()

{'args': {},
'data': '',
'files': {},
'form': {'key': 'value'},
'headers': {'Accept': '/',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '9',
'Content-Type': 'Application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.23.0',
'X-Amzn-Trace-Id': 'Root=1-5f620401-c24c466c4e6fac3ee0fda64d'},
'json': None,
'origin': '113.246.106.31',
'url': 'http://httpbin.org/post'}

1.4 传递 JSON 参数

使用 json 参数直接传递,然后它就会被自动编码。这是 2.4.2 版的新加功能:

  resp = requests.post('http://httpbin.org/post', json = {'key':'value'})
  resp.json()

{'args': {},
'data': '{"key": "value"}',
'files': {},
'form': {},
'headers': {'Accept': '/',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '16',
'Content-Type': 'application/json',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.23.0',
'X-Amzn-Trace-Id': 'Root=1-5f620443-9d8785d6ee6f444a67a162f8'},
'json': {'key': 'value'},
'origin': '113.246.106.31',
'url': 'http://httpbin.org/post'}

1.5 上传文件

使用 files 参数传递文件句柄

  url = 'http://httpbin.org/post'
files = {'file': open('test.xls', 'rb')}
r = requests.post(url, files=files)
r.text

1.6 自定义 Headers

如果想自定义请求的 Headers,同样的将字典数据传递给 headers 参数。

  url = 'http://httpbin.org/get'
headers = {'user-agent': 'lemonban/0.0.1'}
resp = requests.get(url, headers=headers)
resp.json()

{'args': {},
'headers': {'Accept': '/',
'Accept-Encoding': 'gzip, deflate',
'Host': 'httpbin.org',
'User-Agent': 'lemonban/0.0.1',
'X-Amzn-Trace-Id': 'Root=1-5f6205a1-25641a90501e5911352a84c0'},
'origin': '113.246.106.31',
'url': 'http://httpbin.org/get'}

1.7 自定义 Cookies

Requests 中自定义 Cookies 也不用再去构造 CookieJar 对象,直接将字典递给 cookies 参数。

  url = 'http://httpbin.org/get'
cookies = {'cookies_are': 'working'}
resp = requests.get(url, cookies=cookies)
resp.json()

{'args': {},
'headers': {'Accept': '/',
'Accept-Encoding': 'gzip, deflate',
'Cookie': 'cookies_are=working',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.23.0',
'X-Amzn-Trace-Id': 'Root=1-5f6205d9-03efd00833b145237185ded0'},
'origin': '113.246.106.31',
'url': 'http://httpbin.org/get'}

1.8 设置代理

当我们需要使用代理时,同样构造代理字典,传递给 proxies 参数。

  proxies = {
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('http://example.org', proxies=proxies)

1.9 重定向

在网络请求中,我们常常会遇到状态码是 3 开头的重定向问题,在 Requests 中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。

  resp = requests.get('http://github.com', allow_redirects=False)
resp.status_code

301

1.10 禁止证书验证

有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。

在请求的时候把 verify 参数设置为 False 就可以关闭证书验证了。

  import requests
resp = requests.get('https://httpbin.org/get', verify=False)

但是关闭验证后,会有一个比较烦人的 warning,可以使用以下方法关闭警告:

  from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

1.11 设置超时

设置访问超时,设置 timeout 参数即可。

  requests.get('http://github.com', timeout=0.001)

可见,通过 Requests 发起请求,只需要构造好几个需要的字典,并将其传入请求的方法中,即可完成基本的网络请求。

2. 响应

通过 Requests 发起请求获取到的,是一个 requests.models.Response 对象。通过这个对象我们可以很方便的获取响应的内容。

2.1 响应数据

通过 Response 对象的 text 属性可以获得字符串格式的响应内容。

  import requests
resp = requests.get('https://www.baidu.com')
resp.text

Requests 会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现 text 解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。

  import requests
resp = requests.get('https://www.baidu.com')
resp.encoding = 'utf-8'   # 设置编码
resp.text

而如果你需要获得原始的二进制数据,那么使用 content 属性即可。

  resp.content

如果我们访问之后获得的数据是 JSON 格式的,那么我们可以使用 json() 方法,直接获取转换成字典格式的数据。

  resp = requests.get('http://httpbin.org/get')
resp.json()

{'args': {},
'headers': {'Accept': '/',
'Accept-Encoding': 'gzip, deflate',
'Host': 'httpbin.org',
'User-Agent': 'python-requests/2.23.0',
'X-Amzn-Trace-Id': 'Root=1-5f62083f-6b0db04c94aff004d15c0068'},
'origin': '113.246.106.31',
'url': 'http://httpbin.org/get'}

2.2 状态码

通过 status_code 属性获取响应的状态码

  resp = requests.get('http://httpbin.org/get')
resp.status_code

200

2.4 响应报头

通过 headers 属性获取响应的报头

  resp.headers

{'Date': 'Wed, 16 Sep 2020 12:43:17 GMT', 'Content-Type': 'application/json', 'Content-Length': '307', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}

2.5 服务器返回的 cookies

通过 cookies 属性获取服务器返回的 cookies

  import requests
url = 'http://www.baidu.com'
resp = requests.get(url)
resp.cookies

<RequestsCookieJar[Cookie(version=0, name='BDORZ', value='27315', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1600346744, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>

2.6 url

还可以使用 url 属性查看访问的 url。

  params = {'key1': 'value1', 'key2': 'value2'}
resp = requests.get("http://httpbin.org/get", params=params)
resp.url

'http://httpbin.org/get?key1=value1&key2=value2'

3. Session

在 Requests 中,实现了 Session(会话) 功能,当我们使用 Session 时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。

这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递 cookies。

  import requests

session = requests.Session()

session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
resp = session.get('http://httpbin.org/cookies')

print(resp.text)

{
"cookies": {
"sessioncookie": "123456789"
}
}
首先我们需要去生成一个 Session 对象,然后用这个 Session 对象来发起访问,发起访问的方法与正常的请求是一摸一样的。

同时,需要注意的是,如果是我们在 get() 方法中传入 headers 和 cookies 等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个 headers 在 Session 的整个生命周期内都有效的话,需要用以下的方式来进行设置:

  # 设置整个headers
session.headers = {
    'user-agent': 'lemonban/0.0.1'
}
# 增加一条headers
session.headers.update({'x-test': 'true'})


Tags:requests   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
requests一、简介使用 python 做自动化接口测试需要用代码发送 http 请求。requests 是 Python 语言里网络请求库中最好用的,没有之一。requests 库有完善详尽的中文版官方...【详细内容】
2021-12-01  Tags: requests  点击:(14)  评论:(0)  加入收藏
前言接口测试是我们在测试工作中经常见到的,我们工作中常用到的接口工具有jmeter,postman,soupUI等工具,那么在通过代码做接口测试呢?或者通过代码的方式做接口自动化呢? requests...【详细内容】
2021-07-23  Tags: requests  点击:(93)  评论:(0)  加入收藏
最近有些朋友看完小帅b的文章之后把小帅b的表情包都偷了还在我的微信疯狂发表情包嘚瑟我就呵呵了 只能说一句盘他还有一些朋友看完文章不点好看还来催更小帅b也只能说一句继...【详细内容】
2020-06-21  Tags: requests  点击:(83)  评论:(0)  加入收藏
作者:kingname我做了一个垃圾信息过滤的 HTTP 接口。现在有一千万条消息需要经过这个接口进行垃圾检测。 一开始我的代码是这样的:import requestsmessages = [&#39;第一条&#...【详细内容】
2020-03-16  Tags: requests  点击:(61)  评论:(0)  加入收藏
▌简易百科推荐
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(0)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(0)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(7)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(5)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(7)  评论:(0)  加入收藏
借助pyautogui库,我们可以轻松地控制鼠标、键盘以及进行图像识别,实现自动抢课的功能1.准备工作我们在仓库里提供了2个必须的文件,包括: auto_get_lesson_pic_recognize.py:脚本...【详细内容】
2021-12-17  程序员道道    Tags:python   点击:(13)  评论:(0)  加入收藏
前言越来越多开发者表示,自从用了Python/Pandas,Excel都没有打开过了,用Python来处理与可视化表格就是四个字&mdash;&mdash;非常快速!下面我来举几个明显的例子1.删除重复行和空...【详细内容】
2021-12-16  查理不是猹    Tags:Python   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条