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)
浙公网安备 33010602011771号