使用 requests 完成接口测试(一)
要使用 requests 方法需要安装第三方库
打开命令提示符键入:pip3 install requests
使用 GET 方法获取响应数据
import requests r=requests.get(url='http://***.***.***.***:***/login/auth/', params={'name':'1'}) # 协议状态码 print('协议状态码',r.status_code) # 响应数据 print('返回字符串',r.text) print('返回二进制内容',r.content) print('返回的是字典数据类型',r.json()) # 响应头 print('响应头',r.headers)
使用 POST 登录
r = requests.post( url='http://***.***.***.***/login/auth/', params={'username': 'admin', 'password': 'admin'}, headers={'Content-Type': 'application/json;charset=UTF-8'}) print(json.dumps(r.json(), indent=True, ensure_ascii=False)) r = requests.post( url='http://***.***.***.***/login/auth/', data=json.dumps({'username': 'admin', 'password': 'admin'}), headers={'content-type': 'application/json'}) print(json.dumps(r.json(), indent=True, ensure_ascii=False))
params 是用来发送查询字符串,而 data 是用来发送正文的
根据请求头的数据形式判断使用的方法
Content-Type: application/json;charset=UTF-8
数据形式为 JSON 编码格式为 UTF-8
请求头为 JSON ,但要以 DATA 返回参数,需要对请求参数进行序列化的处理
Content-Type:application/x-www-form-urlencoded
数据形式为 form表单,需要对请求参数进行序列化的处理
输出时序列化可以更好的查看返回数据
ensure_ascii 表示是否要转为 ASCII 码,默认打开 True ,那么转为 json 后中文会变成 ASCII 编码,False 中文还是中文,不会变为 ASCII 编码
分别使用 GET 和 POST 方法获取手机号归属地
'''获取手机号归属地''' r=requests.get( url='http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo', params={'mobileCode':'手机号','userID':''}) print('请求地址:',r.url) print('协议状态码:',r.status_code) print('返回协议数据:',r.text) print('请求头:',r.headers)
'''获取手机号归属地''' r=requests.post( url='http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo', data={'mobileCode':'手机号','userID':''}, headers={'content-type':'application/x-www-form-urlencoded'}) print('请求地址:',r.url) print('协议状态码:',r.status_code) print('返回协议数据:',r.text) print('请求头:',r.headers)
'''拉勾网''' r = requests.post( url='https://www.lagou.com/jobs/v2/positionAjax.json', data={ 'data': '自行获取'}, headers={'content-type': 'application/x-www-form-urlencoded', 'Cookie': '自行获取', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62', 'referer':'https://www.lagou.com/wn/jobs?labelWords=&fromSearch=true&suginput=&kd=%25E6%25B5%258B%25E8%25AF%2595%25E5%25BC%2580%25E5%258F%2591%25E5%25B7%25A5%25E7%25A8%258B%25E5%25B8%2588'}) print('协议状态码:',r.status_code) print('返回协议数据:',r.text) print(json.dumps(r.json(),indent=True,ensure_ascii=False))
复杂信息处理,对拉勾网职位信息获取
def login(): r=requests.post( url='http://***.***.***.***/login/auth/', json={'username':'用户名','password':'密码'}, headers={'Content-Type': 'application/json;charset=UTF-8'}) return r.json()['token'] def index(): r=requests.get( url='http://***.***.***.***/interface/index', headers={'Authorization':'JWT {token}'.format(token=login())}) print(r.text) assert r.json()['count']['api']==0 index()
登录并验证返回数据
登陆后返回 token , index 函数中获取 token ,并提交主页验证身份;
使用 assert 判断返回值 Api 个数
from requests.auth import HTTPBasicAuth r=requests.get( url='http://***.***.***.***/v1/api/books', auth=HTTPBasicAuth(username='admin',password='admin'), timeout=180) print(r.status_code) print(r.json())
引入 HTTPBasicAuth 进行简单验证
timeout(超时等待)单位:秒
def login(): r=requests.post( url='https://home.51cto.com/index?reback=https://www.51cto.com/&iframe=0&is_go_to_user_set_mobile=1', data={'_csrf':'自行获取', 'LoginForm[username]':'用户名', 'LoginForm[password]':'密码', 'show_qr':0}, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62', 'Referer':'https://home.51cto.com/index?reback=https://www.51cto.com/', 'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'自行获取'}) print(r.status_code) print(r.text) print(r.cookies) # r.cookies获取set-cookies返回给客户端,sessionID return r.cookies def profile(): r=requests.get( url='https://edu.51cto.com/center/user/info/get-user-info', # 通过请求头cookies把返回的sessionID发送给服务器身份验证 cookies=login()) print(r.text) print(r.status_code) profile()
def login(): s=requests.session() # 使用 session() 完成 cookie 传递 r=s.post( url='https://home.51cto.com/index?reback=https%3A%2F%2Fhome.51cto.com&iframe=0&is_go_to_user_set_mobile=1', data={'_csrf':'自行获取', 'LoginForm[username]':'用户名', 'LoginForm[password]':'密码', 'show_qr':0}, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62', 'Referer':'https://home.51cto.com/index?reback=https://www.51cto.com/', 'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'自行获取'}) print(r.text) print(r.status_code) return s def profile(): r=login().get( url='https://edu.51cto.com/center/user/info/get-user-info') print(r.text) print(r.status_code) profile()
使用不同方法访问51CTO个人页面
def apiTest(method,url,**kwargs): r=requests.request(method=method,url=url,**kwargs) return r r=apiTest( method='post', url='http://***.***.***.***/login/auth/', json={"username":"用户名","password":"密码"}, headers={'Content-Type': 'application/json;charset=UTF-8'} ) print(r.status_code) print(r.text)
重封装 requests(偷懒)简化参数设定