You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动