zoukankan      html  css  js  c++  java
  • 运用元编程批量生成方法调用HTTP接口

    利用元编程批量生成方法调用 HTTP 接口

    概述

    一个项目通常会有一定数量的 http 接口,这些接口按功能模块进行分类,每个模块中的接口有相似点.
    
    例如 github 部分接口如下:

    所有数据格式均为 json.

    • 查看用户信息
      GET https://api.github.com/users/用户名

    • 查看用户下仓库列表
      GET https://api.github.com/repos/用户名/仓库名

    • 获取某个 repo 的内容列表
      GET https://api.github.com/repos/用户名/仓库名/contents

    • repo 中所有的 commits 列表
      GET https://api.github.com/repos/用户名/仓库名/commits

    • 某一条 commit 详情
      GET https://api.github.com/repos/用户名/仓库名/commits/某一条commit的SHA

    • issues 列表
      GET https://api.github.com/repos/用户名/仓库名/issues

    • 某条 issue 详情
      GET https://api.github.com/repos/用户名/仓库名/issues/序号issues 都是以 1,2,3 这样的序列排号的,可以加?state=状态参数过滤状态.

    • 创建/修改文件
      PUT https://api.github.com/repos/用户名/仓库名/contents/文件路径

      {
        "message": "commit message",
        "content": "bXkgbmV3IGZpbGUerdf9udGVudHM="
      }
      
    • ... ...

    如果需要多次调用这些接口通常需要为每个接口封装一个方法,这种方法工作量大,而且扩展性差.

    本文将要实现的功能如下:

    1. 统一管理一个 api 配置文件

      格式大致如下:

      base_url = "https://api.github.com"
      
      # github api
      api = {
          "users": {
              "get_user_info": "{user_name}" # 获取用户信息
          },
          "repos": {
              "get_repo": "{user_name}/{repo_name}",                                      # 获取仓库信息
              "get_contents": "{user_name}/{repo_name}/contents",                         # 获取仓库内容
              "set_file": "{user_name}/{repo_name}/contents/{path}",                      # 添加/修改文件
              "delete_file": "{user_name}/{repo_name}/contents/{path}",                   # 删除文件
              "get_contents_in_dir": "{user_name}/{repo_name}/contents/{dir_name}",       # 获取文件夹中文件列表
              "get_commits": "{user_name}/{repo_name}/commits",                           # 获取提交列表
              "get_commit": "{user_name}/{repo_name}/commits/{commit_RSA}",               # 获取一次提交的详细信息
              "get_issuess": "{user_name}/{repo_name}/issues?state={state:open}",         # 获取issuess列表
              "get_issue": "{user_name}/{repo_name}/{issue_NO}",                          # 获取一个issue详情
          }
      }
      
    2. 通过 meta_class 自动生成方法

    3. 调用

      from api.api_class import API
      
      handler = API(token='***')
      user_info = handler.get_user_info('kailunfan')
      repo_info = handler.get_repo('kailunfan', 'githubApiTest')
      
      # 需要传入payload时用data接收
      data = {
          "message": "new file",
          "content": base64.b64encode("this is the original content!".encode()).decode()
      }
      file_info = handler.set_file("kailunfan", "githubApiTest", "src/test_set_file2.txt", data=data)
      

    完整示例

    github地址

    大致流程

    • 定义一个API类,作为调用方法的handler;
    • 为API类指定一个meta_class;
    • 将配置文件内容定义为API类属性;
    • 在meta_class中读取配置文件,生成HTTP调用的method,url,header以及payload,封装为function,作为属性赋给API;
    • 实例化API调用方法.
  • 相关阅读:
    SecureCRT安装
    wmv12下安装centos7
    SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute
    oracle之 redo过高诊断
    oracle之 手动创建 emp 表 与 dept 表
    oracle之 11.2.0.4 bbed安装
    oracle12c之 控制pdb中sga 与 pga 内存使用
    storm之 Storm 工作原理
    spark之 spark 2.2.0 Standalone安装、wordCount演示
    hadoop之 参数调优
  • 原文地址:https://www.cnblogs.com/aloe-n/p/11143977.html
Copyright © 2011-2022 走看看