python之requests库详解
1.requests库详解
发送http请求,接受http响应的库
安装:pip install requests
1.1 常用方法
requests.get()--->def get(url,params=None,**kwargs) #发送get请求 url:接口请求地址 params:是get请求用于传参,这个参数会自动以?的方式加到url之后,多个参数之间用&分割 **kwargs:可变长度的字典参数 requests.post()--->def post(url, data=None, json=None, **kwargs): #发送post请求 data:用于传参 json:用于传参 files:文件上传 基于postman: form-data:既有表单参数也有文件上传 files x-www-form-urlencoded 表单 data raw: json(json),xml,text (data) binary:二进制文件上传(data) requests.put()--->def put(url, data=None, **kwargs): #发送put请求 requests.delete()-->def delete(url, **kwargs): #发送delete请求 requests.request--->def request(method,url,**kwargs) #发送任意请求,他是get,post,put,delete的底层方法 request.session()--->s=def session() s.request() #返回session对象的request方法 def request( session对象的request方法 self, method, #请求方式 url, #请求路径 params=None, #params参数 data=None, #data参数 json=None, #json参数 headers=None, #请求头 cookies=None, #cookie信息 files=None, #文件上传 -------------------------------------------------------- auth=None, #用户权限token timeout=None, #超时处理 allow_redirects=True, #是否要重定向 proxies=None, #代理 hooks=None, #钩子 stream=None, #文件下载 verify=None, #证书验证 cert=None, #ca证书 ):
说明:get,post,put,delete调用的是request方法,request方法调用session对象的 request方法
requests.request()和session.request()的区别在于:
前者的每个请求都是独立的,后者会自动关联所有的请求的cookie信息
1.2 requests的response对象
- res.text:把返回结果转化成文本输出
- res.json() 把返回结果转换成字典输出
- res.content 把返回结果转换成字节输出
- res.status_code 返回状态码
- res.reson 返回状态信息
- res.cookie 返回cookie信息
- res.encoding 编码格式
- res.headers 响应头信息
- res.request.xxxxx 返回请求的信息
1.3 数据提取
1.3.1 正则表达式提取
re.search("正则表达式",res.text) 只匹配一个值,没有匹配到返回None
re.findall("正则表达式",res.text)匹配多个值,返回列表list,多个值通过下标取值,没有匹配到返回None
def test_login(self): url="user/login" data={ "username":"wangwu", "pwd":"123456" } #post请求,返回响应结果 res=requests.post(url,json=data) print(res.text) #token = re.search("'token':'(.*?)'", res.text) token=re.search('"token":"(.*?)"',res.text)[1] print(token) re.findall('"token":"(.*?)"',res.text)
1.3.2 jsonpath提取
token=jsonpath.jsonpath(res.json(),'$.data.token') 或者 token=jsonpath.jsonpath(res.json(),'$..token')
jsonpath.jsonpath返回的是一个列表,通过下标取值,没有找到返回None
def test_login(self): url="user/login" data={ "username":"wangwu", "pwd":"123456" } #post请求,返回响应结果 res=requests.post(url,json=data) token=jsonpath.psonpath(res.json(),"$.data.token") #token=jsonpath.psonpath(res.json(),"$..token")
1.3.3 字典提取
def test_login(self): url="user/login" data={ "username":"wangwu", "pwd":"123456" } #post请求,返回响应结果 res=requests.post(url,json=data) result=res.json() TestLogin.token=result["data"]["token"]
1.4 接口关联
类变量
class TestLogin: token="" access_token="" csrf="" cookies="" sess=requests.session() def test_login(self): url="user/login" data={ "username":"wangwu", "pwd":"123456" } #post请求,返回响应结果 res=requests.post(url,json=data) print(res.text) TestLogin.token=jsonpath.psonpath(res.json(),"$.data.token")
单独文件保存
1.5 cookie和session关联的接口
#cookie和session关联的接口 def test_get_csrf(self): url="user/search" res=requests.get(url) #返回html使用text接收 result=res.text TestLogin.csrf=re.search('csrf:"(.*?)"',result) TestLogin.cookies=res.cookies #使用cookie登录 def test_login_cookie(self): url="user/login_cookie" headers={ "Accept":"application/json, text/javascript, /; q=0.01", "X-Requested-With":"XMLHttpRequest" } data={ "username":"wangwu", "password":"123456", "csrf":TestLogin.csrf } res=requests.post(url,data=data,headers=headers,cookies=TestLogin.cookies) print(res.json())
1.6 自动添加cookie请求
使用session对象的request方法
@allure.epic("项目名称:易宝商城接口自动化测试") @allure.feature("模块名称:用户管理模块测试用例") class TestLogin: token="" access_token="" csrf="" cookies="" sess=requests.session() #微信公众号获得access_token接口 @pytest.mark.smoke def test_get_access_token(self): url="https://api.weixin.qq.com/cgi-bin/token" params={ "grant_type":"client_credential", "appid":"wx8a9de483b93f225a", "secret":"7923ac815928dee3165720c910effb86" } res=TestLogin.sess.request(method="get",url=url,params=params) #res=requests.get(url,params=params) result=res.json() print(result) TestLogin.access_token=result["access_token"] print(TestLogin.access_token)
1.7 params的使用以及文件上传
@allure.epic("项目名称:易宝商城接口自动化测试") @allure.feature("模块名称:用户管理模块测试用例") class TestLogin: token="" access_token="" csrf="" cookies="" sess=requests.session() #使用cookie登录 def test_login_cookie(self): url="user/login_cookie" headers={ "Accept":"application/json, text/javascript, /; q=0.01", "X-Requested-With":"XMLHttpRequest" } data={ "username":"wangwu", "password":"123456", "csrf":TestLogin.csrf } res = TestLogin.sess.request(method="post", url=url,data=data,headers=headers) #res=requests.post(url,data=data,headers=headers,cookies=TestLogin.cookies) print(res.json()) #params和data的使用 def test_register(self): url="user/register" params={ "application":"app", "cleint_type":"h5" } data={ "username":"wangwu", "password":"123456", "sex":1, "email":"wangwu612@163.com", "address":"北京市" } res=TestLogin.sess.request(method="post",url=url,json=data,params=params) #res=requests.post(url,json=data,params=params) token=re.search("'token':'(.*?)'",res.text) #微信公众号文件上传接口 @pytest.mark.smoke def test_file_upload(self): url="https://api.weixin.qq.com/cgi-bin/media/uploadimg" params={ "access_token":TestLogin.access_token } data={ "metia":open(r"D:\231.png",mode="rb") } res = TestLogin.sess.request(method="post", files=data,params=params) #res=requests.post(url,files=data,params=params) result=res.json() print(result)