OpenAPI在前后端分离的开发中可极大的提高开发效率,而使用NSwag工具在可以使前端的开发更加自动化,代码量更少。由于网上参考资源较少,现记录下。
一、环境
dotnet --list-sdks
5.0.403 [C:\Program Files\dotnet\sdk]
6.0.201 [C:\Program Files\dotnet\sdk]
Win10+Vs2022
二、使用NSwag在前端项目中引入OpenAPI对象
在Vs2022解决方案下的前端项目中打开Connected Services
选择 连接的服务->服务引用(OpenAPI,gRPC,WCF Web Service)
选择 添加新的服务
在向导中选择OpenAPI
输入Swagger Json文件的 URL
点击完成后,NSwag工具会自动生动客户端引用代码
在配置好的服务中点击 查看生成的代码 则可以看到NSwag工具自动生成的代码和类
//----------------------
// <auto-generated>
// Generated using the NSwag toolchain v13.0.5.0 (NJsonSchema v10.0.22.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
namespace FrontWeb
{
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.0.5.0 (NJsonSchema v10.0.22.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class swaggerClient
{
private string _baseUrl = "";
private System.Net.Http.HttpClient _httpClient;
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
public swaggerClient(string baseUrl, System.Net.Http.HttpClient httpClient)
{
三、使用生成的代码实现对OpenAPI的调用
从生成的代码中可以看到,NSwag工具自动生成了一个swaggerClient类,其下实现了OpenAPI后端的各个实例和API可以直接调用
@code {
private ICollection<FrontWeb.Stock>? stocks;
private int tt=0;
private FrontWeb.Stock newStock = new FrontWeb.Stock();
//读取全部记录
protected override async Task OnInitializedAsync()
{
var httpclient = new HttpClient();
var swaggerC = new swaggerClient("https://localhost:7270",httpclient);
stocks = await swaggerC.StocksAllAsync();
if(stocks !=null)
{
tt = stocks.Count;
}
}
//添加一个实体
private void addStock()
{
if(string.IsNullOrEmpty(newStock.CodeNum))
{
return;
}
if (newStock.CodeNum.Trim().Length >= 5)
{
var httpclient = new HttpClient();
var swaggerC = new swaggerClient("https://localhost:7270", httpclient);
swaggerC.StocksAsync(newStock);
if (stocks != null)
{
stocks.Add(newStock);
}
}
}
//删除一个实体
private void deleteStock(FrontWeb.Stock tmpStock)
{
if(tmpStock !=null)
{
var httpclient = new HttpClient();
var swaggerC = new swaggerClient("https://localhost:7270", httpclient);
swaggerC.Stocks4Async(tmpStock.StockId);
stocks.Remove(tmpStock);
}
}
四、参考文章