リクエストインターフェイスPOMモードのパッケージデザイン

次のコードはカプセル化されていません。

import requests
from base_api.base import Base


class Tag(Base):
    _corpsecret = "ZuqJiGA6NjxfWJOizNlcoy0F0gEgIuGyAjHXbx3Cxyo"

    def __init__(self):
        self.get_token(self._corpsecret)
        self.data = self.api_load("../base_api/tag_api.yaml")

    def add(self, tagname):
        _url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/create'
        r = requests.post(_url,
                          params={"access_token": self.get_token(self._corpsecret)},
                          json={"tagname": tagname})
        self.format(r)
        return r.json()

    def get(self, tagid):
        return self.api_send(self.data['get'])
        _url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/get'
        r = requests.post(_url,
                          params={
                              "access_token": self.get_token(self._corpsecret),
                              "tagid": tagid,
                                  })
        self.format(r)
        return r.json()

    def delete(self, tagid):
        _url = 'https://qyapi.weixin.qq.com/cgi-bin/tag/delete'
        r = requests.get(_url,
                          params={
                              "access_token": self.get_token(self._corpsecret),
                              "tagid": tagid,
                                  })
        self.format(r)
        return r.json()

コードには多くの冗長性があることがわかり、以下はカプセル化するためにyamlデータ駆動型フォームを採用しています。

base.pyファイルの最初:

import requests
import json

import yaml


class Base:
    _token = []
    _token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    _corpid = "wwcbefdd1de3927e42"

    @classmethod
    def yaml_load(cls, path):
        with open(path, encoding='utf-8') as f:
            return yaml.safe_load(f)

    @classmethod
    def format(cls, r):
        cls.r = r
        # print(json.dumps(r.json(), indent=2))
        print(json.dumps(json.loads(r.text), indent=2, ensure_ascii=False))

    def api_load(self, path):
        return self.yaml_load(path)

    def api_send(self, req: dict):
        req['params']['access_token'] = self._token[0]
        print(req)
        r = requests.request(req["method"],
                             url=req["url"],
                             params=req["params"],
                             json=req["json"])
        self.format(r)
        return r.json()

    @classmethod
    def get_token(cls, corpsecret):
        # todo 这里还可以把时间记录下来,每次调用都判读一下时间
        if corpsecret not in cls._token:
            res_dict = cls.get_access_token(corpsecret)
            cls._token.append(res_dict["access_token"])
        return cls._token[-1]

    @classmethod
    def get_access_token(cls, corpsecret):
        _token_url_params = {
            "corpid": cls._corpid,
            "corpsecret": corpsecret,
        }
        res = requests.get(cls._token_url, params=_token_url_params)
        return res.json()

getおよびpostリクエストボディに対する次のtag.pyファイルリクエストは単純になります


from base_api.base import Base


class Tag(Base):
    _corpsecret = "ZuqJiGA6NjxfWJOizNlcoy0F0gEgIuGyAjHXbx3Cxyo"

    def __init__(self):
        self.get_token(self._corpsecret)
        self.data = self.api_load("../base_api/tag_api.yaml")

    def get_api(self):
        pass

    def add(self):
        return self.api_send(self.data['add'])

    def get(self):
        return self.api_send(self.data['get'])

    def delete(self, tagid):
        return self.api_send(self.data['delete'])

次のユースケースレイヤーはよりエレガントです

from base_api.tag import Tag
from base_api import base
from base_api.group_chat import GroupChat
import pytest


class TestTag(object):
    # 测试数据的测试驱动
    data = base.Base.yaml_load("test_tag_data.yaml")
    @classmethod
    def setup_class(cls):
        cls.tag = Tag()

    def test_add(self, name):
        r = self.tag.add()
        assert r["errcode"] == 0

    def test_get(self):
        r = self.tag.get(3)
        assert r["errcode"] == 0

    def test_get_api(self):
        r = self.tag.get_api()
        assert r["errcode"] == 0

    def test_delete(self):
        r = self.tag.delete(3)
        assert r["errcode"] == 0

データはtest_tag_data.yamlファイルにカプセル化されます:

get:
  method: post
  url: https://qyapi.weixin.qq.com/cgi-bin/tag/get
  params:
    access_token: ${token}
    tagid: 3
  json:




add:
  method: post
  url: https://qyapi.weixin.qq.com/cgi-bin/tag/create
  params:
    access_token: ${token}
    tagid: 3
  json:
    tagname: Tencent

上記はステップドリブンパッケージです

コード:https//github.com/chaunchengZeng/API-

おすすめ

転載: blog.csdn.net/chuancheng_zeng/article/details/109249787