swagger 配置 二

 

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1",
                        new OpenApiInfo
                        {
                            Title = "Test API V1",
                            Version = "v1",
                            Description = "A sample API for testing Swashbuckle",
                            TermsOfService = new Uri("http://tempuri.org/terms")
                        }
                    );

    c.RequestBodyFilter<AssignRequestBodyVendorExtensions>();

    c.OperationFilter<AssignOperationVendorExtensions>();

    c.SchemaFilter<ExamplesSchemaFilter>();

    c.DescribeAllParametersInCamelCase();

    c.UseOneOfForPolymorphism();
    c.UseAllOfForInheritance();

    c.SelectDiscriminatorNameUsing((baseType) => "TypeName");
    c.SelectDiscriminatorValueUsing((subType) => subType.Name);


    string xmlName = Assembly.GetEntryAssembly().GetName().Name + ".xml";
    string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlName);
    c.IncludeXmlComments(xmlPath, true);
    //参数 例如 Get 方式 查询 OrderName 在swagger上显示的是orderName
    c.DescribeAllParametersInCamelCase();
    // c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Basic.xml"));

    // 确保接口也能被识别为多态基类
    c.GeneratePolymorphicSchemas(info =>
    {
        if (info.IsInterface && info.Name == nameof(IAnimal))
        {
            return new[] { typeof(Cat), typeof(Lion) };
        }
        return Enumerable.Empty<Type>();
    });


    //
    c.EnableAnnotations();
});

 

开启 swagger 注解

类库  Swashbuckle.AspNetCore.Annotations

EnableAnnotations
注解包含 SwaggerRequestBody SwaggerResponse SwaggerParameter

        /// <summary>
        /// 
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        /// <remarks>
        /// ## Heading 1
        /// 
        ///     POST /Order
        ///     {
        ///         "id": "123",
        ///         "orderName": "冰箱"
        ///     }
        /// 
        /// </remarks>
        // [HttpPost(Name ="Product")]
        [HttpPost("Product")]
        public IActionResult Post([FromBody, SwaggerRequestBody(Description = "The Auth request body")] Order custormOrder)
        // public IActionResult Post([FromBody] Order order)
        {
            return Ok();
        }
        [SwaggerResponse(200, "成功响应", typeof(Order))]
        [SwaggerResponse(400, "参数错误")]
        [SwaggerOperation(summary: "获取订单", description: "获取订单")]
        [ProducesResponseType(typeof(Order), (int)HttpStatusCode.OK)]
        [HttpGet("GetOrderName")]
        public IActionResult Get([FromQuery, SwaggerParameter(Description = "订单名称", Required = true)] string OrderName)
        {
            Order order = new Order { Id = 1, OrderName = "冰箱订单" };
            return Ok(order);
        }
 

  对应设置 

 

 

  对应

 

 

设置 swagger 参数 都是驼峰 形式
c.DescribeAllParametersInCamelCase();

 设置 请求体

    c.RequestBodyFilter<AssignRequestBodyVendorExtensions>();

 

    public class AssignRequestBodyVendorExtensions : IRequestBodyFilter
    {
        public void Apply(OpenApiRequestBody requestBody, RequestBodyFilterContext context)
        {
            requestBody.Extensions.Add("x-purpose", new OpenApiString("test111111111"));
        }
    }

 

对应

 

设置 接口描述信息

 

c.OperationFilter<AssignOperationVendorExtensions>();

    public class AssignOperationVendorExtensions : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            operation.Extensions.Add("x-purpose", new OpenApiString("test"));
        }
    }

对应

 

设置 模板信息

c.SchemaFilter<ExamplesSchemaFilter>();

public class ExamplesSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        schema.Example = GetExampleOrNullFor(context.Type);
    }

    private IOpenApiAny GetExampleOrNullFor(Type type)
    {
        switch (type.Name)
        {
            case "Order":
                return new OpenApiObject
                {
                    ["id"] = new OpenApiInteger(123),
                    ["orderName"] = new OpenApiString("冰箱的订单"),
                };
            default:
                return null;
        }
    }
}

对应 的 控制器 代码 的 参数Order

   

        [HttpPost("Product")]
        public IActionResult Post([FromBody, SwaggerRequestBody(Description = "The Auth request body")] Order custormOrder)
        // public IActionResult Post([FromBody] Order order)
        {
            return Ok();
        }

对应

     

 

设置 多态

c.UseOneOfForPolymorphism();
c.UseAllOfForInheritance();
c.SelectDiscriminatorNameUsing((baseType) => "TypeName");
c.SelectDiscriminatorValueUsing((subType) => subType.Name);

// 确保接口也能被识别为多态基类
c.GeneratePolymorphicSchemas(info =>
{
if (info.IsInterface && info.Name == nameof(IAnimal))
{
return new[] { typeof(Cat), typeof(Lion) };
}
return Enumerable.Empty<Type>();
});

 

[SwaggerSubType(typeof(Lion))]
[SwaggerSubType(typeof(Cat))]
public interface  IAnimal
{
    public int Id { get; }
    public string Name { get; }
}

public class Cat : IAnimal
{
    public Cat(int id, string name)
    {
        Id = id;
        Name = name;
    }
    public int Id { get; private set; }
    public string Name { get; private set; }
}

对应代码

        [HttpGet("GetAnimal")]
        public ActionResult<IAnimal> GetAnimal([FromQuery] string animalType)
        {
            IAnimal animal = new Lion(1, "狮子");
            return Ok(animal);
        }

对应

 

posted on 2025-05-25 23:51  是水饺不是水饺  阅读(61)  评论(0)    收藏  举报

导航