• [pytest] requests模块


    视频教程传送门 

    12、Pytest接口自动化之request模块返回的response对象详解_哔哩哔哩_bilibili

    requests是用来发送http请求以及接收http响应的第三方库,主要用于接口自动化测试

    pip install requests

    PyCharm  快捷键Alt+Enter 自动导包

    目录

    一、requests库常用的方法

    1.requests.get()

    2.requests.post()

    四种传参方式对应的Content-Type

    data和json传参的区别:主要是通过请求头Content-Type来区分

    文件上传

    3.requests.request()

    二、requests模块返回的response对象

    三、请求必须带请求头的接口

    四、需要cookie鉴权和session鉴权的接口

    1.使用cookie关联

    2.使用session关联


    一、requests库常用的方法

    requests.get(url, params=None, **kwargs)发送get请求
    url是请求路径,params传递参数
    requests.post(url, data=None, json=None, **kwargs)发送post请求
    url是请求路径,data传递参数,json传递参数
    requests.put(url, data=None, **kwargs)发送put请求
    requests.delete(url, **kwargs)发送delete请求
    requests.request(method, url, **kwargs)发送所有请求,是所有请求的底层方法,会调用:session.request()

      

    1.requests.get()

    1. import requests
    2. class TestRequest
    3. #get请求:获取接口统一鉴权码token接口
    4. def test_get_token(self):
    5. url = "https://api.xxx.com/token"
    6. data ={
    7. #待传参数查看API文档
    8. "grant_type":"client_credential",
    9. "appid":"xxx"
    10. "secret":"xxx"
    11. }
    12. res = requests.get(url=url,params=data)
    13. print(res.json())
    14. if __name__ == '__main__':
    15. TestRequest().test_get_token()

    2.requests.post()

    会用到上述 test_get_token 获取token, 定义一个全局变量access_token存放获取的token

    1. import requests
    2. class TestRequest
    3. #全局变量,类变量,通过类名调用
    4. access_token= ""
    5. #get请求:获取接口统一鉴权码token接口
    6. def test_get_token(self):
    7. ……
    8. TestRequest.access_token = res.json()['access_token']
    9. #post请求:编辑标签接口
    10. def test_edit_flag(self):
    11. url = "https://api.xxx.com/xxx/update?access_token=" + TestRequest.access_token
    12. data = {
    13. #参数格式查看API文档
    14. "tag":{"id":"xxx","name":"xxx"}
    15. }
    16. res = requests.post(url=url,json=data)
    17. print(res.json())
    18. if __name__ == '__main__':
    19. TestRequest().test_get_token()
    20. TestRequest().test_edit_flag()

    说明:上述  res = requests.post(url=url,json=data) 中 json 改为 data会报错

    四种传参方式对应的Content-Type

    Content-Type: 是服务器要求传入的报文的内容类型

    请求:请求方式、请求路径、请求头、请求正文
    postman四种传参方式对应的Content-Type的值如下

    form-dataContent-Type:multipart/form-data
    x-www-form-urlencodedContent-Type:application/x-www-form-urlencoded
    rawtextContent-Type:text/plain
    javascriptContent-Type:application/javascript
    jsonContent-Type:application/json
    htmlContent-Type:text/html
    xmlContent-Type:application/xml
    binaryContent-Type:application/octet-stream

    参数说明:
    (1)请求的参数是:form-data,代表这是表单传参或者文件上传。type=file
    Content-Type:multipart/form-data;
    (2)请求的参数是:x-www-form-urlencoded,代表这是表单传参。(k1=v1&k2=v2)
    Content-Type:application/x-www-form-urlencoded(data传参
    (3)请求的参数是:raw,代表原始格式传参。
    text:Content-Type:text/plain(data传参)
    javascript:Content-Type:application/javascript
    json:Content-Type:application/json(json传参)
    html:Content-Type:text/html
    xml:Content-Type:application/xml
    (4)请求的参数是:binary,代表原始格式传参。
    Content-Type:application/octet-stream

    data和json传参的区别:主要是通过请求头Content-Type来区分

    data和json传参以及Content-Type的关系如下:
    (1)data传参:报文是dict类型 -> Content-Type:application/x-www-form-urlencoded
                               报文是str类型 -> Content-Type:text/plain

    (2)json传参:报文可以是dict也可以是str -> Content-Type:application/json

    data 可以传键值对,即非嵌套的dict,例如{key1:value1,key2:value2},也可以传str格式
    json 可以传任何形式的dict(包括嵌套的dict)

    json.loads()    把json字符串转化成dict形式
    json.dumps()  把dict格式转化成json字符串

    例如,上面的edit的例子,也可以改成如下,不会报错

            str_data = json.dumps(data) 
            res = requests.post(url=url,data=str_data)

    1. #post请求:编辑标签接口
    2. def test_edit_flag(self):
    3. url = "https://api.xxx.com/xxx/update?access_token=" + TestRequest.access_token
    4. data = {
    5. #参数格式查看API文档
    6. "tag":{"id":"xxx","name":"xxx"}
    7. }
    8. str_data = json.dumps(data)
    9. res = requests.post(url=url,data=str_data)
    10. print(res.json())

    文件上传

    1. #文件上传
    2. def test_file_upload(self):
    3. url = "https://api.xxx.com/xxx/uploading?access_token=" + TestRequest.access_token"
    4. data = {
    5. "media":open(r"D:\star.png","rb")
    6. }
    7. res = requests.request("post",url=url,files=data)
    8. print(res.json())

    3.requests.request()

    get/post/put/delete 都是调用requests.request方法,后者调用 session.request方法

    method请求方式
    url请求路径
    params=Noneget方式传参
    data=Nonepost/put方式传参
     json=None  post方式传参
    headers=None请求头
    cookies=None请求cookie
     files=None文件上传
    auth=None鉴权
    timeout=None超时
    allow_redirects=True是否允许重定向
    proxies=None设置代理
    hooks=None在请求得到响应后的自定义操作
    stream=None文件下载
    verify=Nonessh认证
    cert=NoneCA证书
    requests.session()创建会话对象

    二、requests模块返回的response对象

    res.json()获得返回的字典格式的数据
    res.text获得返回的字符串格式的数据
    res.content获得返回的bytes字节类型的数据
    res.status_code返回状态码
    res.reason返回状态信息
    res.cookies返回cookie信息
    res.encoding返回编码格式
    res.headers返回响应头
    res.request.xxx返回请求的数据,如:请求头、请求参数

       

    三、请求必须带请求头的接口

    需要取到 res.text中,csrf_token的值,使用正则匹配

    requests.request() 中传入参数headers

    1. ……
    2. #加一个全局变量
    3. csrf_token = ""
    4. #访问首页接口
    5. def test_start(self):
    6. url = "http://xxx"
    7. res = requests.request(method="get",url=url)
    8. print(res.json())
    9. #正则提取,".*?"非贪婪模式、最小匹配
    10. obj = re.search('name="csrf_token" value="(.*?)"',res.text)
    11. TestRequest.csrf_token = obj.group(1)
    12. #登录接口
    13. def test_login(self):
    14. url = "http://xxx"
    15. data = {
    16. "username": "xxx",
    17. "password": "xxx",
    18. "csrf_token": TestRequest.csrf_token
    19. }
    20. headers = {
    21. #根据接口文档写
    22. "Accept": "xxx",
    23. "X-Requested-With": "XMLHttpRequest"
    24. }
    25. res = requests.request(method="post",url=url,data=data,headers=headers)
    26. print(res.json())
    27. ……


    四、需要cookie鉴权和session鉴权的接口

    上述还不好使,打开浏览器控制台,查看Cookies

     90%以上的基于web的接口都有cookie鉴权
    两种解决方式:使用cookie关联、使用session关联

    1.使用cookie关联

    1. #新增全局变量
    2. php_cookie = ""
    3. #访问首页接口
    4. def test_start(self):
    5. ...
    6. #提取Cookie
    7. TestRequest.php_cookie = res.cookies
    8. #登录接口
    9. def test_login(self):
    10. ...
    11. res = requests.request(method="post",url=url,data=data,headers=headers,cookies=TestRequest.php_cookie)
    12. print(res.json())


    2.使用session关联

    1. #新增全局变量
    2. sess = requests.session()
    3. #访问首页接口
    4. def test_start(self):
    5. ...
    6. res = TestRequest.sess.request(method="get",url=url)
    7. ...
    8. #登录接口
    9. def test_login(self):
    10. ...
    11. res = TestRequest.sess.request(method="post",url=url,data=data,headers=headers)
    12. ...


     
     
     

  • 相关阅读:
    常用API
    国庆中秋特辑(三)使用生成对抗网络(GAN)生成具有节日氛围的画作,深度学习框架 TensorFlow 和 Keras 来实现
    期货开户止损的方法和关键点
    【Java】Java中对Map进行排序
    P1650 田忌赛马,贪心,线性dp
    【牛客刷题】——Python入门 05 运算符(下)
    彻底解决 WordPress cURL error 28 错误
    Arduino驱动ICG-20660L传感器(惯性测量传感器篇)
    面向OLAP的列式存储DBMS-9-[ClickHouse]的常用日期时间操作
    一文搞懂Java中的继承(父类与子类间的联系)+实例分析
  • 原文地址:https://blog.csdn.net/wy_hhxx/article/details/126675886