接口框架项目实战-pytest(三)requests模块详解以及cookie,session关联处理

发布于:2024-05-09 ⋅ 阅读:(28) ⋅ 点赞:(0)

一、requests库简介
用于发送合同谈判请求的第三方库,安装:pip install requests

二、requests库常用的方法
1.requests.get(url, params=None, **kwargs) 发送get请求(通过params传
参)
2.requests.post(url, data=None, json=None, **kwargs) 发送post请求(通过data
和json传参)
请求头:

1.请求正文格式:multipart/form­data 文件上传

Content­Type:multipart/form­data 一般用于传价值对和文件

2.请求正文格式:application/x­www­form­urlencoded 键值对

Content­Type:application/x­www­form­urlencoded 以表单的方式传参,数据格式:

key1=value1&key2=value2

3.请求正文格式“:raw

Content-Type:application/json

Content-Type:text/plain

Content-Type:application/javascript

Content-Type:text/html

Content-Type:application/xml
4.请求正文格式:binary

Content-Type:application/octet­stream 二进制流的数据

3.requests.put() 发送put请求
4.requests.delete() 发送delete请求5.requests.request() 发送任意请求,最核心的方法
method, 请求方式
url, 请求路径
params=None, get方式传参
data=None, post,put,patch传参
headers=None, 请求头
cookies=None, 请求的cookie信息
files=None, 文件上传

json=None post传参

auth=None, 鉴权
timeout=None, 超时
allow_redirects=True, 重定向
proxies=None, 代理
hooks=None,
stream=None, 文件下载
verify=None, 是否需要验证证书
cert=None, CA证书
6.requests.session() 发送任意请求,最核心的方法

三、requests()执行之后的返回response对象
res.text 响应的字符串格式数据
res.content 响应的bytes格式数据
res.json() 响应自动数据格式
res.status_code 状态码
res.reason 状态信息
res.cookies cookie 信息
res.headers 响应头
res.request.headers 请求头

四、实战
post :
data 默认 Content-Type:application/x­www­form­urlencoded
json 默认 Content-Type:application/json
json.dumps() 将字典序列化成str
json.loads() 将str反序列化成字典
files 文件上传 默认 Content­Type:multipart/form­data

import random

import requests


class Test4Api:
    access_token=""
    def test_get_token(self):
        data = {
            "grant_type": "client_credential",
            "appid": "wx6b11b3efd1cdc290",
            "secret": "106a9c6157c4db5f6029918738f9529d"
        }
        res = requests.get(url="https://api.weixin.qq.com/cgi-bin/token", params=data)
        return_date= res.json()
        print(return_date)
        print(return_date["access_token"])
        Test4Api.access_token=return_date["access_token"]
        print(Test4Api.access_token)

    def test_get_tags(self):
        params = {"access_token": Test4Api.access_token}
        print(params)
        res=requests.get("https://api.weixin.qq.com/cgi-bin/tags/get",params=params)
        print(res.text)
    def test_get_news(self):
        data={
            "tag":{
                    "id":23475,
                    "name":"ms"+str(random.randint(100000,999999))
                   }
        }
        res= requests.post("https://api.weixin.qq.com/cgi-bin/tags/update?access_token="+ Test4Api.access_token,json=data)
        print(res.request.headers)
        print(res.text )
    def test_uploadimg(self):
        data = {
            "media": open(r"C:\Users\Administrator\Desktop\1.jpg",mode="rb")
        }
        res = requests.post("https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=" + Test4Api.access_token,
                            files=data)
        print(res.request.headers)
        print(res.json())


五、需要带请求头的接口,需要带cookie的接口做cookie关联,基本上所有web项目的接口都是需要做cookie关联

import re

import requests


class Test5Api:
    csrf_token=""
    cookies=""
    def test_get_csrf_token(self):
        res = requests.get(url="http://47.107.116.139/phpwind")
        # 通过正则表达式取值
        obj= re.search('name="csrf_token" value="(.*?)"',res.text)
        print(obj)
        Test5Api.csrf_token=obj.group(1)
        Test5Api.cookies= res.cookies
        print(Test5Api.csrf_token)

    def test_login(self):
        data = {

        "username":"msxy",
        "password":"msxy",
        "csrf_token": Test5Api.csrf_token,
        "backurl": "http://47.107.116.139/phpwind/"
        }
        res = requests.post("http://47.107.116.139/phpwind/index.php?m=u&c=login",
                            data=data,cookies=Test5Api.cookies)
        print(res.request.headers)
        print(res.text)

六、一般情况我们会使用session关联

class Test5Api:
    csrf_token=""
    session=requests.session()
    def test_get_csrf_token(self):
        res = Test5Api.session.request("get",url="http://47.107.116.139/phpwind")
        # 通过正则表达式取值
        obj= re.search('name="csrf_token" value="(.*?)"',res.text)
        print(obj)
        Test5Api.csrf_token=obj.group(1)
        print(Test5Api.csrf_token)
import re

import requests

from pytestdemo.testcases.test_demo5 import Test5Api


class Test6Api:
    def test_login(self):
        data = {

        "username":"msxy1",
        "password":"msxy",
        "csrf_token": Test5Api.csrf_token,
        "backurl": "http://47.107.116.139/phpwind/"
        }
        res = Test5Api.session.request("post","http://47.107.116.139/phpwind/index.php?m=u&c=login")
        print(res.request.headers)
        print(res.text)

或者可以conftest.py(推荐使用)

import re

import pytest
import requests

@pytest.fixture(scope="session",autouse=True)
def get_csrf_token():
    session=requests.session()
    res = session.request("get", url="http://47.107.116.139/phpwind")
    # 通过正则表达式取值
    obj = re.search('name="csrf_token" value="(.*?)"', res.text)
    print(obj)
    print(obj.group(1))


    yield  (session,obj.group(1))

class Test6Api:
    def test_login(self,get_csrf_token):
        session,token=get_csrf_token
        data = {

        "username":"msxy1",
        "password":"msxy",
        "csrf_token": token,
        "backurl": "http://47.107.116.139/phpwind/"
        }
        res = session.request("post","http://47.107.116.139/phpwind/index.php?m=u&c=login",
                            data=data)
        print(token)
        print(res.request.headers)
        print(res.text)