Краткое введение в Swagger
Swagger/Open API постепенно стал стандартом в области Restful API.Все больше и больше систем используют swagger для стандартизации разработки интерфейсных документов.Поскольку сам Swagger не зависит от конкретного языка и платформы разработки, он особенно подходит в качестве раздельный внешний и внутренний интерфейс, стандартный для использования. Swagger официально предоставляет две формы пользовательского интерфейса документа: одна — Swagger UI, а другая — Swagger Editor.
-
Пользовательский интерфейс Swagger часто используется как часть разработки проекта.Многие программы перенимают свои собственные характеристики и добавляют в код программы комментарии, аннотации, декораторы и т. д., чтобы завершить автоматическое создание документов интерфейса swagger и отображение документов.
-
Swagger Editor предоставляет онлайн-редактор для редактирования, который позволяет редактировать интерфейсы в виде документов и предоставляет две функции генерации: код на стороне сервера и код на стороне клиента.Генерация кода охватывает большинство основных языков и фреймворков.Удобство.
непосредственно используемый код
У многих студентов могут возникнуть вопросы, можно ли в итоге использовать сгенерированный код?
Мой ответ не только работает, но и работает хорошо. Возьмите ng-alain в качестве примера
расположение кодаGitHub.com/VE l Холодная вода/Тяня…Настройте параметр basePath поставщика.
export function apiConfig(): Configuration {
return new Configuration({
basePath: `${location.protocol}//${location.host}`
});
}
Зарегистрируйте следующий модуль
ApiModule.forRoot(apiConfig),
Затем освободите каталог дляGitHub.com/VE l Холодная вода/Тяня…Этот каталог, видите ясно, сгенерированный каталог можно изменить, не меняя ни слова, если его нужно перегенерировать после изменения, не будет ли это большой проблемой?
После размещения его в проекте angular вы можете с удовольствием использовать сервис, как показано в следующем примере:GitHub.com/VE l Холодная вода/Тяня…
profileSave(event?) {
const entry: EditProfileDto = Object.assign({}, event);
this.coreService.userUpdate(entry).subscribe((res) => {
if (res) {
this.settings.setUser(res);
this.msg.success('个人资料修改成功');
}
});
}
saveSysSettings(event) {
const entry = Object.assign({}, event);
this.coreService.settingUpdateSettingsByName('main', entry).subscribe((res) => {
if (res) {
this.settingsData = res;
this.msg.success('系统设置更新成功');
}
});
}
load() {
this.coreService.settingGetSettingsByName('main').subscribe((res) => {
if (res) {
this.settingsData = res;
}
});
}
Метод становится ощутимым.
Автоматически генерировать, загружать и распаковывать
Предыдущий шаг можно использовать, но это немного хлопотно, каждый раз вам нужно открывать editor.swagger.io и вставлять документ, затем нажимать «Создать», а затем распаковывать его.Разве это не достаточно гладко?
Итак, давайте напишем скрипт для автоматизации вышеописанного.полный адрес скрипта
async function loadSwagger() {
/** 读取 swagger.json 接口文档文件 */
const jsonPath = path.resolve(process.cwd(), 'dist', 'swagger.json');
const json = require(jsonPath);
const client = axios.create({
httpsAgent: new https.Agent({
rejectUnauthorized: false
})
});
/**
* 提交 post 到服务器并获得下载链接
*/
const result = await client.post(gateway, { spec: json });
if (result.data && result.data.link) {
const response = await client({
method: 'GET',
url: result.data.link,
responseType: 'stream'
})
const local = path.resolve(process.cwd(), 'swagger.zip');
const generatedFolder = path.resolve(process.cwd(), './../client/src/generated');
const templateFolder = path.resolve(process.cwd(), 'decompress', 'typescript-angular-client');
const decompress = path.resolve(process.cwd(), 'decompress');
// 处理下载压缩包文件,解压并删除临时文件
response.data.pipe(fs.createWriteStream(local)).on('finish', (done: any) => {
fs.createReadStream(local).pipe(unzip.Extract({ path: 'decompress' })).on('close',
async (done: any) => {
fs.unlinkSync(local);
await removeFolder(generatedFolder);
fs.renameSync(templateFolder, generatedFolder);
await removeFolder(decompress);
});
});
}
}
/**
* 若已经生成,则删除文件夹
* @param folder 文件夹
*/
async function removeFolder(folder: string) {
if (fs.existsSync(folder)) {
await new Promise((resolve) => {
rimraf(folder, () => {
resolve(true);
});
})
}
}
loadSwagger();
Всего несколько строчек кода. Как вы думаете, это очень просто? Да, это просто, но очень хорошо завершает нашу работу.
После того, как у вас есть сценарий, вам просто нужно
ts-node xxxxx/apigen.ts
чтобы выполнить работу.
В заключение, стандартный интерфейс играет очень хорошую нормативную роль в развитии разделения внешнего и внутреннего интерфейса, а также важной частью является беспроблемный опыт разработки.Если у вас есть какие-либо вопросы или есть лучший способ, добро пожаловать общаться с автором.github.com/vellengs