api/PropertiesClasses

发布时间 2023-05-25 16:02:51作者: 挖洞404

1、介绍

为了方便存储和操作properties数据,定义Properties类进行处理。

由于各种场景之间的properties数据存在相对固定的差异,因此分别定义子类,继承Properties类,重写部分属性和方法。

  • Properties类,通用的properties数据对象。
  • Headers类,http请求和响应的头部字段。sep1='\n',sep2=': ',strip_flag=True,ignore_case=True
  • Params类,url的直接参数。sep1='&',sep2='=',strip_flag=False,ignore_case=False
  • Cookies类,请求头部的cookies字段的值。sep1=';',sep2='=',strip_flag=True,ignore_case=False

2、Properties类和子类

3、api/PropertiesClass

import requests

from api import PropertiesModule

'''
通用对象
'''


class Properties:
    def __init__(self, s: str = '', sep1: str = '', sep2: str = '', strip_flag: bool = False,
                 ignore_case: bool = True):
        # 核心对象属性
        self.property_list = list()
        # 键值对和键值对之间的分隔符
        self.sep1 = sep1
        # 键和值的分隔符
        self.sep2 = sep2
        # 该对象解析时,是否对键和值的首尾去除空白字符
        self.strip_flag = strip_flag
        # 该对象匹配键时,是否忽略大小写
        self.ignore_case = ignore_case
        if s != '' and sep1 != '' and sep2 != '':
            # 去除\r字符
            s = s.replace('\r', '')
            self.parse(s)

    def parse(self, s: str):
        # 解析
        self.property_list = PropertiesModule.parse(s=s, sep1=self.sep1, sep2=self.sep2, strip_flag=self.strip_flag)

    def toString(self):
        return PropertiesModule.toString(self.property_list, self.sep1, self.sep2)

    def clone(self):
        # 创建克隆对象,类型是Properties或其子类
        clone_obj = type(self)()
        # list的copy是浅克隆,但是这里list的元素都是list,所以不能直接用
        clone_obj.property_list = PropertiesModule.clone(self.property_list)
        return clone_obj

    def hasName(self, name: str):
        return PropertiesModule.hasName(self.property_list, name=name, ignore_case=self.ignore_case)

    def getFirstValue(self, name: str):
        return PropertiesModule.getFirstValue(self.property_list, name=name, ignore_case=self.ignore_case)

    def getValue(self, name: str):
        return PropertiesModule.getValue(self.property_list, name=name, ignore_case=self.ignore_case)

    def remove(self, name: str):
        PropertiesModule.remove(self.property_list, name=name, ignore_case=self.ignore_case)

    def update(self, name: str, value: str):
        PropertiesModule.update(self.property_list, name=name, value=value, ignore_case=self.ignore_case)

    def add(self, name, value):
        PropertiesModule.add(self.property_list, name, value)

    def getNames(self):
        return PropertiesModule.getNames(self.property_list)

    def get(self, index: int):
        return PropertiesModule.get(arr=self.property_list, index=index)

    def get_name(self, index: int):
        return PropertiesModule.get_name(arr=self.property_list, index=index)

    def get_value(self, index: int):
        return PropertiesModule.get_value(arr=self.property_list, index=index)

    def remove_index(self, index: int):
        PropertiesModule.remove_index(arr=self.property_list, index=index)

    def update_index(self, index: int, name: str, value: str):
        PropertiesModule.update_index(arr=self.property_list, index=index, name=name, value=value)

    """
    以下方法是非直接对应函数操作
    """

    def update_byStr(self, s):
        if s is None or s == '':
            return
        # 去除\r字符
        s = s.replace('\r', '')
        arr = PropertiesModule.parse(s, '\n', ':', True)
        for item in arr:
            if self.hasName(item[0]):
                self.update(item[0], item[1])

    def update_or_add(self, name: str, value: str):
        if self.hasName(name):
            self.update(name, value)
        else:
            self.add(name, value)

    def update_or_add_byStr(self, s):
        if s is None or s == '':
            return
        # 去除\r字符
        s = s.replace('\r', '')
        arr = PropertiesModule.parse(s, '\n', ':', True)
        for item in arr:
            if self.hasName(item[0]):
                self.update(item[0], item[1])
            else:
                self.add(item[0], item[1])

    def size(self):
        return len(self.property_list)

    def isEmpty(self):
        if self.property_list:
            return True
        else:
            return False


"""
请求和响应头部字段
"""


class Headers(Properties):
    def __init__(self, obj: str = ''):
        super().__init__()
        # 核心对象属性
        self.property_list = list()
        # 键值对和键值对之间的分隔符
        self.sep1 = '\n'
        # 键和值的分隔符
        self.sep2 = ':'
        # 该对象解析时,是否对键和值的首尾去除空白字符
        self.strip_flag = True
        # 该对象匹配键时,是否忽略大小写
        self.ignore_case = True
        if type(obj) == str and obj != '':
            # 直接的请求报文,截取头部字段字符串部分
            obj: str = obj.replace('\r', '')
            self.property_list = PropertiesModule.parse(obj, '\n', ':', True)
        elif type(obj) == requests.structures.CaseInsensitiveDict:
            # requests.res.headers和requests.res.request.headers的类型
            obj: requests.structures.CaseInsensitiveDict
            for name, value in obj.items():
                self.property_list.append([name, value])


"""
参数
"""


class Params(Properties):
    def __init__(self, s: str = ''):
        super().__init__(s)
        # 键值对和键值对之间的分隔符
        self.sep1 = '&'
        # 键和值的分隔符
        self.sep2 = '='
        # 该对象解析时,是否对键和值的首尾去除空白字符
        self.strip_flag = False
        # 该对象匹配键时,是否忽略大小写
        self.ignore_case = False
        if type(s) == str and s != '':
            # 去除\r字符
            s = s.replace('\r', '')
            self.property_list = PropertiesModule.parse(s, self.sep1, self.sep2, self.strip_flag)


"""
请求头部cookies字段
"""


class Cookies(Properties):
    def __init__(self, s: str = ''):
        super().__init__(s)
        # 键值对和键值对之间的分隔符
        self.sep1 = ';'
        # 键和值的分隔符
        self.sep2 = '='
        # 该对象解析时,是否对键和值的首尾去除空白字符
        self.strip_flag = True
        # 该对象匹配键时,是否忽略大小写
        self.ignore_case = False
        if type(s) == str and s != '':
            # 去除\r字符
            s = s.replace('\r', '')
            self.property_list = PropertiesModule.parse(s, self.sep1, self.sep2, self.strip_flag)