接口测试 -- requests

requests是python实现的最简单易用的HTTP库

官网地址:http://cn.python-requests.org/zh_CN/latest/

一、环境安装

cmd -> pip install requests,安装完成后输入pip list可以看到requests即代表安装成功

二、get请求

1. 未携带参数

# 第一步:导入包
import requests
# 第二步:发送get请求
urlstr = 'https://www.wanandroid.com/blog/show/2'
r = requests.get(url=urlstr) # r = response
# 第三步:获取结果
print(r.text)

注意:状态码200只能说明这个接口访问的服务器地址是对的,并不能说明功能OK,一般要查看响应的内容,r.text是返回文本信息

2. 携带参数 -- 参数单独写

# 导入包
import requests
# 发送get请求
urlstr = 'https://www.wanandroid.com/article/query'
param = {'k':'Android'} # 参数
r = requests.get(url=urlstr,params=param)
# 获取结果
print(r.text)
print(r.status_code)

3. 携带参数 -- 参数直接放在url中

import requests
# 发送get请求,将参数直接携带在url中
urlstr = 'https://www.wanandroid.com/article/query?key=Android'
r = requests.get(url=urlstr)
# 获取结果
print(r.text)
print(r.status_code) # 打印出状态码
print(r.headers) # 打印出header信息

4.多个参数格式:

param = {"key1": "value1", "key2": "value2", "key3": "value3"}

5.content

百度首页如果用r.text会发现获取到的内容有乱码,因为百度首页响应内容是gzip压缩的(非text文本)

如果是在fiddler工具乱码,是可以点击后解码的,在代码里面可以用r.content这个方法,content会自动解码 gzip 和deflate压缩

代码:

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

print(r.url)
print(r.encoding) # 编码
print(r.content) # 获取返回内容(自动解码gzip)
print(r.headers)
print(r.cookies)

6.response -- 返回内容还有其它更多信息

-- r.status_code     #响应状态码

-- r.content         #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩

-- r.headers         #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None

-- r.json()          #Requests中内置的JSON解码器,处理后对应Python的dict

-- r.url             # 获取url

-- r.encoding        # 编码格式

-- r.cookies         # 获取response返回的cookie

-- r.raw             #返回原始响应体

-- r.text            #字符串方式的响应体,会自动根据响应头部的字符编码进行解码

-- r.raise_for_status() #失败请求(非200响应)抛出异常

三、发送post请求

1. 用help函数查看相关注释和案例内容

import requests
help(requests)

① 查看python发送get和post请求的案例

② 发送post请求(json形式)

post的body是json类型,有两种方法来传递json数据
第一种:先导入json模块,用dumps方法转化成json格式

import requests,json
# 发送请求
urlstr = 'http://httpbin.org/post'
payload = {'qq群名':'selenium+jmeter+loadrunner','qq群号':'106014970'}
# 通过json.dumps方法将python字符串转化成json类型
payload = json.dumps(payload)
# 发送请求
r = requests.post(url=urlstr,data=payload)
# 获取结果
print(r.text)
# 返回为json类型,既可以通过r.json方法来查看结果
print(r.json())

第二种:使用json参数默认处理成json格式进行传递

import requests,json
# 发送post请求
urlstr = 'http://httpbin.org/post'
payload = {'qq群名':'selenium+jmeter+loadrunner','qq群号':'106014970'}
# 发送请求,接口请求为json数据,通过json=自动将python对象转变为json类型
r = requests.post(url=urlstr,json=payload)
# 获取结果
print(r.text)
# 返回为json类型,即可以通过r.json方法来查看结果
print(r.json())

最后返回结果,传到data里

2. 发送post请求 -- 表单形式

① 登录接口

# 导入包
import requests
# 发送post请求
urlstr = 'https://www.wanandroid.com/user/login'
# 参数
data = {'username':'annieliang','password':'123456'}
r = requests.post(url=urlstr,data=data)
# 获取结果(与fiddler中抓到的请求一致)
print(r.text)
print(type(r.json())) # 查看类型
# 通过dict-key来访问对应的值
print(r.json())
print(r.json()['errorCode'])
print(r.json()['data']['username'])
运行结果为:
{"data":{"admin":false,"chapterTops":[],"collectIds":[-1],"email":"","icon":"","id":22395,"password":"","token":"","type":0,"username":"annieliang"},"errorCode":0,"errorMsg":""}
<class 'dict'>
{'errorMsg': '', 'errorCode': 0, 'data': {'password': '', 'admin': False, 'type': 0, 'collectIds': [-1], 'icon': '', 'token': '', 'chapterTops': [], 'username': 'annieliang', 'email': '', 'id': 22395}}
0
annieliang

②判断登录成功 -- 可以抓取页面上的关键元素,比如:账号名称,注销按钮,然后通过正则表达式提出这2个关键字

import requests
# 发送post请求
urlstr = 'https://www.wanandroid.com/user/login'
# 参数
payload = {'username':'annieliang','password':'123456'}
# 第二步:发送请求
r = requests.post(url=urlstr,data=payload)
# 第三步:获取结果(与fiddler中抓到的请求一致)
print(r.text)
# 查看类型后为字典类型,r.json将response中返回的json处理成了dict
print(type(r.json()))
# 通过dict-key来访问对应的值
print(r.json()['data']['username'])
# 判断是否登录成功(username是否是username)
# 判断返回的json数据是否有登录的用户名或通过正则来获取
if r.json()['data']['username'] == payload['username']:
print('登录成功!')
运行结果为:
{"data":{"admin":false,"chapterTops":[],"collectIds":[-1],"email":"","icon":"","id":22395,"password":"","token":"","type":0,"username":"annieliang"},"errorCode":0,"errorMsg":""
<class 'dict'>
annieliang
登录成功!

四、携带header和cookie参数发送请求

1.以玩Android登录为例,抓包查看请求头,header为Python的字典类型,所以可以支持dict类型的所有操作方式添加header信息,可以直接定义{},也可以通过dict[key]的方式添加

# 导入包
import requests
# 发送get请求
urlstr = 'https://www.wanandroid.com/blog/show/2'

header = {'User-Agent':'Mozzilla/5.0'}
cookie = {'JSESSIONID':'3E08EBE7538380CE432C7FEA74244011'}

r = requests.get(url=urlstr,headers=header)
# 获取结果
print(r.text)
print(r.headers)
print(r.cookies)

fiddler抓包得到header和cookie信息:

五、正则表达式(待补充)

六、os包的用法-path(待补充)

原文地址:https://www.cnblogs.com/annie1226/p/10888293.html