Requests安装
- 安装 pip install requests
- 卸载 pip uninstall requests
- 查看全部包 pip list
- 查看包 pip show requests
接口必备常识
- 需要知道接口的服务部署在哪个服务器上
- host地址和port端口
- 对应的数据库地址,最好能远程访问
- 后台日志查询
get
get请求有两种情况:
- 第一种是一个纯url地址,没问号,也没问号后面的参数。
- 第二种是带问号和参数的。
"""
不同接口对应不同的写法,第一种get方法是挂载在url后面
"""
import requests
host="http://service.envicloud.cn:8082"
accesskey="D3VWZW5NMTYYMDY0OTQ2NJMXOA=="
citycode=101010100
path=f"/v2/weatherforecast/{accesskey}/{citycode}"
url=host+path
r=requests.get(url=url)
print(r.json())
import requests
"""
第二种get方式,是通过传参的方式,也就是挂载在?后面&隔开的
"""
url = "https://api.apiopen.top/getSingleJoke"
param = {
"sid": "28654780"
}
r = requests.get(url=url, params=param)
print(r.json())
r.json()跟r.text的区别
- r.text 返回的是text文本字符串
- r.json requests的内置son解析器,返回的是dict
响应返回的相关内容
- r.status_code 响应状态码
- r.content 会自动为你解码gzip和deflate压缩
- r.headers 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
- r.json() Requests中内置的json解码器,json转成python的字典了
- r.url 获取url
- r.encoding 编码格式
- r.cookies 获取返回的cookie
- r.text 会自动根据响应头部的字符编码进行解码
- r.raise_for_status() 失败请求(非200响应)抛出异常
post
ssl验证
- http的请求相对于http安全级别高,需要验证SSL证书,添加verify=False,可以进行忽略对SSL的验证(这种情况一般都是开着fiddler导致的)
- 使用引入urllib3,使用urllib3.disalbe_warnings()忽略警告
import requests
import urllib3
# 用于去除警告
urllib3.disable_warnings()
url = "https://www.cnblogs.com/wp950416/"
# verify忽略验证
r=requests.get(url,verify=False)
print(r.text)
post请求参数
常见有的四种,并不是只有四种
第一种--> 请求参数放在url里(这种的跟普通get请求带参的效果是一样的)
第二种--> 请求参数是body为json的格式
第一种:使用json,自动转成json格式
import requests
host = "http://49.235.92.12:9000"
login_path = "/api/v1/login/"
body = {
"username": "test",
"password": "123456"
}
# application/json 直接传json=
r = requests.post(url=host + login_path, json=body)
print(r.text)
第二种:使用data,需要转换为json格式
import requests
import json
host = "http://49.235.92.12:9000"
login_path = "/api/v1/login/"
body = {
"username": "test",
"password": "123456"
}
header={"Content-Type":"application/json"}
# 在使用这个的时候,需要申明content-type为application/json
r = requests.post(url=host + login_path, data=json.dumps(body),headers=header)
print(r.text)
第三种--> 请求参数body为x-www-form-urlencoded的格式
import requests
host = "http://49.235.92.12:9000"
login_path = "/api/v1/login/"
# Content-Type:application/x-www-form-urlencoded
# 参数username=test&password=123456
body = {
"username": "test",
"password": "123456"
}
r = requests.post(url=host + login_path, data=body)
print(r.text)
第四种--> 请求参数body为xml的格式
import requests
# xml格式请求
url = "http://www.example.com/"
header = {
"User-Agent": "Fiddler",
"Content-Type": "text/xml"
}
# 这边的三引号是为了避免字符串换行,需要换行符
body = '''
<?xml version=“1.0” encoding = “UTF-8”?>
<COM>
...
...
</COM>
'''
# 遇到编码报错时候,对body进行encode
# 如果没有显示头部信息可以传头部
r = requests.post(url, data=body.encode("utf-8"), header=header)
接口用例与测试
如何开展接口测试
- 项目处于开发阶段,前后端联调接口是否请求的通.(对应数据库增删改查-开发进行自测)
- 有接口需求文档,开发已完成联调(可以转测),这是功能测试展开之前
- 专项测试:如测流量大小、查看图片压缩大小、测试接口请求响应时间,压力测试,并发,性能
- 版本上线前,进行整体回归测试,查看接口是否有一场(如404等).对准备上线的版本进行抓包查看服务器地址是否都正确.
- 版本功能稳定后,接口自动化(回归测试)
- 同时也可以应用在安全测试、性能测试领域中.
接口文档规范
接口文档三要素
- 接口概述(接口实现功能、url地址、get/post、接口使用场景描述)
- 接口入参(params/body、headers)
- 接口出参(json或其他格式)
# 接口描述
接口地址:http://apis.juhe.cn/birthEight/query
返回格式:json
请求方式:get/post
请求示例:http://apis.juhe.cn/birthEight/query?year=2021&month=1&day=15&hour=2
接口备注:根据阳历日期和小时查询生辰八字、五行属性等信息,支持1900年~2100年区间
# 接口入参(最好说明字段长度)
| 名称 | 必填 | 类型 | 说明 |
| ---- | ----- | ---- | ------ |
| | key | 是 | string |
| | year | 是 | string |
| | month | 是 | string |
| | day | 是 | string |
| | hour | 是 | string |
# 接口出参
# # 返回示例
{
"reason": "success",
"result": {
"year": 2020,/*农历年份数字*/
"month": 12,/*农历月份数字*/
"day": 3,/*农历日期数字*/
"Animal": "鼠",/*属相*/
"ImonthCn": "腊月",/*农历月份*/
"IDayCn": "初三",/*农历日期*/
"cYear": 2021,/*公历年份数字*/
"cMonth": 1,/*公历月份数字*/
"cDay": 15,/*公历日期数字*/
"gzYear": "庚子",/*干支纪年*/
"gzMonth": "己丑",/*干支纪月*/
"gzDay": "癸亥",/*干支纪日*/
"isLeap": false,/*是否闰月*/
"ncWeek": "星期五",/*周几*/
"isTerm": false,/*是否节气*/
"Term": null,/*节气,例:大寒,isTerm为true时不为null*/
"astro": "魔羯座",/*星座*/
"eightAll": {
"eight": [/*八字*/
"庚子",
"己丑",
"癸亥",
"庚申"
],
"shu": "水"/*属(如:属水)*/
},
"fiveAll": {
"five": [/*五行*/
"金水",
"土土",
"水水",
"金金"
],
"lose": "木火"/*缺(如:缺木火)*/
}
},
"error_code": 0
}
# # 返回参数说明
| 称 | 类型 | 说明 |
| ---------- | ------ | -------- |
| error_code | int | 状态码 |
| reason | string | 状态提示 |
| result | json | 返回结果 |
用例设计
接口测试是无界面的功能测试,设计用例思路跟功能测试一样(只是一个注重的是测前端页面,一个注重的是测后端接口)
输入参数测试:针对输入的参数进行测试,也可以说是假定接口参数的不正确性进行的测试,确保接口对任意类型的输入都做了相应的处理:
- 输入参数合法
- 输入参数不合法
- 输入参数为空
- 输入参数为null
- 输入参数超长
接口测试与功能测试的区别
- 抽奖活动,功能测试抽奖只能一次,但是接口测试可以有多次,因为多个并发请求,服务器会容易出错来不及判断是不是一次机会.
- 接口测试可以绕开前端,前端有一些输入限制,如6-20位,但是接口却可以输入5位数提交,看服务端是不是做了6-20的限制(也就是说,点点点测的是页面功能,接口测的是服务端功能)
json
json科普
- json是一种数据交换格式
- json独立于编程语言
dict转json
注意:字典是无序的
import json
info = {
"name": "吴鹏",
"age": 18,
"thing": {
"class": 838142,
"sex": "男"
}
}
print(type(info))
print(info)
print(type(json.dumps(info, ensure_ascii=False)))
print(json.dumps(info, ensure_ascii=False))
python中dict转json(类型切换)
python | json |
---|---|
dict | object(str) |
list,tuple | array |
str,unicode | string |
int,long,float | number |
True | true |
False | false |
None | null |
json转dict
注意:将json转换为dict的时候,不会在有元祖存在,只会作为数组存在.
import json
info = {
"name": "吴鹏",
"age": 18,
"thing": {
"class": 838142,
"sex": "男"
}
}
json_info=json.dumps(info,ensure_ascii=False)
json_dict=json.loads(json_info)
print(json_dict)
print(type(json_dict))
str转json
import json
info='{"name":"吴鹏","age":18}'
info_dict=eval(info)
print(type(info_dict))
print(info_dict)
dict_json=json.dumps(info_dict,ensure_ascii=False)
print(type(dict_json))
print(dict_json)
token关联
- 先获取token
- 如果token是放在请求头的话,将获取的token放到下一个请求中
import json
import requests
# 第一个请求中,获取token
url = "http://localhost:8000/api/v1/login/"
info = {
"name": "wp",
"age": 18
}
r = requests.post(url, json=info)
token = r.json()["token"]
# 第二个请求,放入token
url2 = "http://localhost:8000/api/v1/userinfo"
header = {
"Authorization": f"Token {token}"
}
r2 = requests.get(url2, headers=header)
print(r2.text)
session关联
session的基本介绍
- 一种管理用户状态和信息的机制,与cookies将数据保存在客户端本地不同的是,session的数据保存在服务器端,一般放在服务器的内存里.
- 客户端与服务端通过一个sessionID来进行沟通,为了防止不同的客户之间出现冲突和重复,这个SeesionID一般是一个较长的随机字符串(一般32或者48个字节)
- 在做python接口自动化,里面的session与前两条的session不是一回事.
session保持会话
- 跨请求:比如登录之后发帖,这个发帖是依赖先登录的(需要穿登录cookie)
- http协议是无状态的,也就是每个请求都是独立的.那么登录后的一系列动作,都需要用cookie来验证身份是否是登录状态,为了高效的管理会话,保持会话,于是就有了session
session会话案例
从发送登录请求之后,返回请求头关于token的相关信息,定义请求头,将获取的token信息进行更新,也就是更新session头部信息,最终关联其他的请求.
import requests
# 1. 登录
s = requests.session() # 模拟代码中的浏览器的功能,建立会话
url = "http://192.168.40.128:8000/v1/auth"
data = {
"username": "wupeng",
"password": 123456,
}
r = s.post(url=url, json=data) # 这边因为使用了json的参数,后续头部默认contentType为json格式
# 获取token
token = r.json()['token']
# 定义头部token参数
h = {
"Authorization": f'Token {token}'
}
# 将当前的头部信息更新到session中
s.headers.update(h)
# 2. 获取个人信息
url2 = "http://192.168.40.128:8000/v1/auth/userinfo"
# 使用之前浏览器留下的session,进行发送get请求,携带请求头token信息
r2 = s.get(url2)
print(r2.text)
cookie
有些登录并不都是token来关联的,有一部分是通过cookies,先登录获取cookies,后面的请求都带上cookies