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)

  

posted @ 2023-06-09 23:27  万溪汇海  阅读(353)  评论(0编辑  收藏  举报