運用元編程批量生成方法調用HTTP接口

利用元編程批量生成方法調用 HTTP 接口

概述

一個項目一般會有必定數量的 http 接口,這些接口按功能模塊進行分類,每一個模塊中的接口有類似點.

例如 github 部分接口以下:python

全部數據格式均爲 json.git

  • 查看用戶信息
    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=狀態參數過濾狀態.github

  • 建立/修改文件
    PUT https://api.github.com/repos/用戶名/倉庫名/contents/文件路徑編程

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

若是須要屢次調用這些接口一般須要爲每一個接口封裝一個方法,這種方法工做量大,並且擴展性差.api

本文將要實現的功能以下:this

  1. 統一管理一個 api 配置文件url

    格式大體以下:code

    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 自動生成方法token

  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調用方法.
相關文章
相關標籤/搜索