如何在NSwag(ASP.NET Core)中生成自定义响应示例值?
我之前折腾NSwag的时候也遇到过这个问题,原来用Swashbuckle的那套属性确实没法直接照搬,不过NSwag本身有自带的方案,甚至还能自定义更灵活的逻辑,给你整理了两个完整的实现示例,你可以根据需求选:
方案一:用NSwag自带的
OpenApiResponseExampleAttribute(最简单的方式) 这个是NSwag官方提供的属性,不需要额外安装包,用来给单个接口指定静态示例非常方便。
步骤1:定义响应模型和示例提供者类
先写你的响应模型,再创建一个实现IOpenApiExampleProvider<T>的示例类,用来返回自定义示例数据:
// 你的响应模型 public class UserResponse { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } } // 示例提供者类 public class UserResponseExample : IOpenApiExampleProvider<UserResponse> { public UserResponse GetExample() { // 返回你想要展示的自定义示例 return new UserResponse { Id = 123, Name = "John Doe", Email = "john.doe@example.com" }; } }
步骤2:在控制器方法上添加属性
给目标接口的响应标注上[OpenApiResponseExample],指定响应码和对应的示例类:
[HttpGet("{id}")] [ProducesResponseType(typeof(UserResponse), StatusCodes.Status200OK)] // 关键:给200响应绑定自定义示例 [OpenApiResponseExample(200, typeof(UserResponseExample))] public IActionResult GetUser(int id) { // 实际业务逻辑 return Ok(new UserResponse { Id = id, Name = "Sample User", Email = "sample@example.com" }); }
步骤3:配置NSwag启用示例生成
在Program.cs(或者Startup.cs)里配置NSwag文档生成器,开启示例生成开关:
builder.Services.AddOpenApiDocument(settings => { settings.Title = "My API"; settings.Version = "v1"; // 启用示例生成,自动识别OpenApiResponseExampleAttribute settings.GenerateExamples = true; });
方案二:自定义操作处理器(更灵活的全局/动态控制)
如果需要更复杂的逻辑(比如根据环境动态生成示例、给所有接口统一加示例),可以自定义IOperationProcessor来实现,对应你找到的那个issue里的思路:
步骤1:创建自定义操作处理器
public class CustomExampleOperationProcessor : IOperationProcessor { public bool Process(OperationProcessorContext context) { // 可以根据操作ID、响应码等条件精准控制示例 if (context.OperationDescription.Operation.OperationId == "GetUser" && context.OperationDescription.Operation.Responses.TryGetValue("200", out var response)) { var customExample = new UserResponse { Id = 456, Name = "Jane Smith", Email = "jane.smith@example.com" }; // 将示例添加到Swagger响应的Examples中 response.Examples.Add("custom-example", new OpenApiExample { Summary = "自定义用户示例", Value = OpenApiAnyFactory.CreateFromJson(JsonSerializer.Serialize(customExample)) }); } // 返回true表示继续处理其他操作处理器 return true; } }
步骤2:注册自定义处理器到NSwag
在NSwag配置里添加这个处理器:
builder.Services.AddOpenApiDocument(settings => { settings.Title = "My API"; settings.Version = "v1"; // 添加自定义操作处理器 settings.OperationProcessors.Add(new CustomExampleOperationProcessor()); });
两种方案的区别:方案一适合单个接口的静态示例,简单直接;方案二适合需要全局控制或动态生成示例的场景,灵活性更高。记得确保你的NSwag是最新版本,这些特性在旧版本里可能没有哦~
内容的提问来源于stack exchange,提问作者dommer




