.NetCore3.1中使用Swagger生成接口文檔

前言

本來在Swagger的基礎上,前後端開發人員在開發生產期間,可以藉此進行更加便捷的溝通交流。可是總有些時候,遇到一些難纏的,又不講道理,偏偏覺得將Swagger文檔地址丟給客戶會不夠正式!死活要一份word文檔。

.NetCore3.1中使用Swagger生成接口文檔

可是這個時候,如果接口數量上百個,甚至更多,一個一個手動輸入word,那將是一筆耗時的工作。但卻有什麼辦法可以解決呢?

對了,利用Swagge生成的Json文件轉換為word文檔不就可以了嗎?

思路

1. 獲取Swagger接口文檔的Json文件

2. 解析Json文件數據填充到Html的表格中

3.根據生成的html轉work文檔

開始

一、根據Swagger版本獲取Json數據

1.通過Swagger源碼文件可以看到

.NetCore3.1中使用Swagger生成接口文檔

可以拿到swagger生成的文檔數據,所以我們可以新建一個控制器SwaggerController.cs,

<code>        private readonly SwaggerGenerator _swaggerGenerator;
public SwaggerController(SwaggerGenerator swaggerGenerator)
{
_swaggerGenerator = swaggerGenerator;
}
/// <summary>
/// 導出文件
/// /<summary>
/// <param>文件類型
/// <param>版本號V1
/// <returns>
[HttpGet]
public FileResult ExportWord(string type,string version)
{
string contenttype = string.Empty;

var model = _swaggerGenerator.GetSwagger(version); //1. 根據指定版本獲取指定版本的json對象。
}/<code>

2. 在Startup.cs文件中,利用net core的ioc容器,注入SwaggerGenerator實例化,這樣在後面的調用中可以直接使用這個方法

<code>            services.AddScoped<swaggergenerator>(); //注入SwaggerGenerator,後面可以直接使用這個方法/<swaggergenerator>/<code>

二、文件數據填充到Html的表格中

根據上面獲取的model文件數據,這個時候,我們利用Razor文件,結合html的table模板,將數據遍歷填充到頁面中,生成完整的頁面

Html模板

<code>@using Swashbuckle.AspNetCore.Swagger; 




<title>Swagger API文檔代碼文件/<title>
<style><br><br> table, table td, table th {<br> border: 1px solid #000000;<br> border-collapse: collapse;<br> }<br><br> table {<br> table-layout: fixed;<br> word-break: break-all;<br> }<br><br> tr {<br> height: 20px;<br> font-size: 12px;<br> }<br> /<style>



Word接口文檔

@Model.Info.Title


接口文檔 @Model.Info.Version


聯繫方式


作者:@Model.Info.Contact.Name








接口描述


@Model.Info.Description


<table>

說明



類型



/<table>
@foreach (var item in Model.Paths)
{
if (item.Value.Operations != null)
{
foreach (var operation in item.Value.Operations)
{

@operation.Value.Summary


<table>





URL
@item.Key


請求方式

@operation.Key



@if (operation.Value.Parameters != null && operation.Value.Parameters.Count > 0)

{

參數名
參數類型
是否必填
說明

@foreach (var param in operation.Value.Parameters)
{

@param.Name
@param.In
@param.Required
@param.Description

}
}


狀態碼
說明

@if (operation.Value.Responses != null && operation.Value.Responses.Count > 0)

{
foreach (var response in operation.Value.Responses)
{

@response.Key
@response.Value.Description


}
}

示例


請求參數



返回值


/<table>


}

}

}


/<code>

將數據遍歷到靜態頁面中,

<code>        /// <summary>
/// 將數據遍歷靜態頁面中
/// /<summary>
/// <param>靜態頁面地址
/// <param>獲取到的文件數據
/// <returns>
public static string GeneritorSwaggerHtml(string templatePath, OpenApiDocument model)
{
var template = System.IO.File.ReadAllText(templatePath);
var result = Engine.Razor.RunCompile(template, "i3yuan", typeof(OpenApiDocument), model);
return result;
}/<code>

三、根據生成的html轉work文檔

<code>        /// <summary>
/// 靜態頁面轉文件
/// /<summary>
/// <param>靜態頁面html
/// <param>文件類型
/// <param>上下文類型
/// <returns>
public Stream SwaggerConversHtml(string html, string type, out string contenttype)
{
string fileName = Guid.NewGuid().ToString() + type;
//文件存放路徑
string webRootPath = _hostingEnvironment.WebRootPath;
string path = webRootPath + @"\\Files\\TempFiles\";
var addrUrl = path + $"{fileName}";
FileStream fileStream = null;
var provider = new FileExtensionContentTypeProvider();
contenttype = provider.Mappings[type];
try
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);

}
var data = Encoding.Default.GetBytes(html);
var stream = ByteHelper.BytesToStream(data);
//創建Document實例
Document document = new Document();
//加載HTML文檔
document.LoadFromStream(stream, FileFormat.Html, XHTMLValidationType.None);
//保存為Word
document.SaveToFile(addrUrl, FileFormat.Docx);

document.Close();
fileStream = File.Open(addrUrl, FileMode.OpenOrCreate);
var filedata = ByteHelper.StreamToBytes(fileStream);
var outdata = ByteHelper.BytesToStream(filedata);

return outdata;
}
catch (Exception)
{
throw;
}
finally
{
if (fileStream != null)
fileStream.Close();
if (File.Exists(addrUrl))
File.Delete(addrUrl);//刪掉文件
}
}/<code>
<code>    public class ByteHelper
{
public static byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 設置當前流的位置為流的開始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}

/// 將 byte[] 轉成 Stream
public static Stream BytesToStream(byte[] bytes)
{
Stream stream = new MemoryStream(bytes);
return stream;
}

}/<code>

四、最終效果

將html轉換為word後,我們就可以看到帶有 .doc 的效果了!差不多是如下效果

.NetCore3.1中使用Swagger生成接口文檔

總結

1. 到這基本就結束了,通過簡易的幾個接口的方式,展示瞭如何通過將Swagger接口文檔生成word文檔。可以根據自己的html模板生成各式的word樣式文檔說明。

2.寫這篇番外主要是因為之前介紹了關於如何使用Swagger生成在線文檔,但實際工作中,可能也會遇到這種要各種正式word文檔的客戶,所以在此分享一些想法和思路,同時希望大家不吝指教。


分享到:


相關文章: