在做前后端分離項(xiàng)目的時(shí)候务嫡,我們經(jīng)常還要一層`JSDK`來(lái)存放我們的后端請(qǐng)求漆改,后端加一個(gè)前端也要加一個(gè)准谚,有時(shí)候就感覺(jué)很麻,有感而發(fā)樊破,就想自己搞一個(gè)代碼生成工具唆铐,其實(shí)后面還可以開(kāi)發(fā)代碼自動(dòng)生成工具,但是都自動(dòng)生成了或链,還有程序員干啥澳盐,這個(gè)就暫時(shí)不寫(xiě)(實(shí)際上是作者寫(xiě)不出來(lái)),來(lái)看看下面的代碼
```python
# -*- coding: UTF-8 -*-
import os
import re
from urllib import request
import json
class Tool:
? ? """
? ? swagger 轉(zhuǎn)js sdk工具類
? ? """
? ? def __init__(self, host, dir_path):
? ? ? ? """
? ? ? ? :param host:遠(yuǎn)程json文件地址
? ? ? ? :param dir_path: 寫(xiě)入文件目錄
? ? ? ? """
? ? ? ? self.host = host
? ? ? ? self.dir_path = dir_path
? ? def raise_api(self):
? ? ? ? url = self.host
? ? ? ? req = request.Request(url)
? ? ? ? res = request.urlopen(req)
? ? ? ? res = json.loads(res.read().decode('utf-8'))
? ? ? ? paths = res['paths']
? ? ? ? # 清空文件
? ? ? ? self.clear_file()
? ? ? ? # 存放方法字符串?dāng)?shù)據(jù)
? ? ? ? for x in paths:
? ? ? ? ? ? path = x
? ? ? ? ? ? tmp_x = x[1:-1]
? ? ? ? ? ? method_name = re.sub(r'\/|-', '_', re.sub('{|}', '', tmp_x))
? ? ? ? ? ? file_name = method_name.split('_')[0]
? ? ? ? ? ? params = re.findall(r'.*?\{(.*?)\}.*?', path)
? ? ? ? ? ? if params:
? ? ? ? ? ? ? ? params.append('params')
? ? ? ? ? ? ? ? params = tuple(params).__str__()
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? params = '(params)'
? ? ? ? ? ? for method in paths[x]:
? ? ? ? ? ? ? ? # 過(guò)濾掉路徑中的 parameters
? ? ? ? ? ? ? ? if method == 'parameters':
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? tmp_method_name = self.request_methods(paths[x][method]['operationId'], method, params)
? ? ? ? ? ? ? ? fun_content_str = self.fun_content(method, path)
? ? ? ? ? ? ? ? desc = ''
? ? ? ? ? ? ? ? if 'description' in paths[x][method]:
? ? ? ? ? ? ? ? ? ? desc = paths[x][method]['description']
? ? ? ? ? ? ? ? note = self.raise_note(path, desc)
? ? ? ? ? ? ? ? if os.path.exists(self.dir_path + file_name + '.js'):
? ? ? ? ? ? ? ? ? ? pass
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? self.init_file(file_name + '.js')
? ? ? ? ? ? ? ? fun_str = '%s%s%s\n' % (note, tmp_method_name, fun_content_str)
? ? ? ? ? ? ? ? file = open(self.dir_path + file_name + '.js', 'a')
? ? ? ? ? ? ? ? file.write(fun_str)
? ? ? ? ? ? ? ? file.close()
? ? def request_methods(self, fun_name, method, params):
? ? ? ? """
? ? ? ? 構(gòu)造方法名
? ? ? ? :param fun_name:
? ? ? ? :param params:
? ? ? ? :return:
? ? ? ? """
? ? ? ? return 'export const %s = %s => {\n' % (re.sub(r'_(v1|v2|v3|0)', '', fun_name), re.sub(r'\'', '', params))
? ? def fun_content(self, method, path):
? ? ? ? """
? ? ? ? 構(gòu)造方法內(nèi)容
? ? ? ? :param method:
? ? ? ? :param path:
? ? ? ? :return:
? ? ? ? """
? ? ? ? return '? ? return http.%s(`%s`, params)\n}\n' % (method, re.sub(r'\{', '${', path))
? ? def raise_note(self, path, description):
? ? ? ? """
? ? ? ? 生成注釋
? ? ? ? :param path:
? ? ? ? :param description:
? ? ? ? :return:
? ? ? ? """
? ? ? ? return '/**\n * path: %s\n * description: %s\n */\n' % (path, re.sub(r'\n', ' \n * ', description))
? ? def clear_file(self):
? ? ? ? """
? ? ? ? 清空文件
? ? ? ? :return:
? ? ? ? """
? ? ? ? files = os.listdir(self.dir_path)
? ? ? ? for x in files:
? ? ? ? ? ? if os.path.exists(self.dir_path + x):
? ? ? ? ? ? ? ? file = open(self.dir_path + x, 'w')
? ? ? ? ? ? ? ? file.truncate()
? ? ? ? ? ? ? ? file.write('''/**
* %s API
*/\n
import http from 'src/utils/http'\n
''' % (re.sub(r'.js', '', x)))
? ? ? ? ? ? ? ? file.close()
? ? def init_file(self, file_name):
? ? ? ? """
? ? ? ? 初始化文件筛婉,主要是初始化頭部
? ? ? ? :param file_name:
? ? ? ? :return:
? ? ? ? """
? ? ? ? file = open(self.dir_path + file_name, 'w')
? ? ? ? file.write('''/**
* %s API
*/\n
import http from 'src/utils/http'\n
''' % (re.sub(r'.js', '', file_name)))
? ? ? ? file.close()
```
調(diào)用方式
```python
from app.swagger2js import tool
# json的地址
url = 'http://192.168.2.22:5002/swagger.json'
# 保證你的同級(jí)目錄下面有sdk這個(gè)文件夾,我懶入蛆,我不想檢測(cè)有沒(méi)有這個(gè)文件夾
dir_path = os.getcwd() + '\sdk\\'
tmp = tool.Tool(url, dir_path)
tmp.raise_api()
```
**該方法適用`swagger`和用`YAPI`導(dǎo)出的`json`**硕勿,來(lái)一來(lái)看一看大家以后不用謝`sdk`層了