.Net 6最小API在Swagger中定义枚举参数

tvmytwxo  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(280)

有没有一种方法可以像描述基于枚举的API那样,使用最小的API来描述Swagger中的枚举?
我有一个简单的枚举:

public enum GeometryType
{
    WKT,
    GeoJson
}

字符串
和一个端点:

app.MapGet("/geometry", (GeometryType? geometryType) =>
{

};


但是参数在我的swagger页面中被定义为一个字符串,因此我没有像使用控制器那样使用可用选项获得漂亮的结果:

{
 "name": "geometryType",
  "in": "query",
  "schema": {
  "type": "string"
 }
}


我尝试在Swagger设置中显式Map类型:

services.AddSwaggerGen(options =>
{
    options.MapType<GeometryType>(() => new OpenApiSchema { Type = "integer", Format = "int32", Enum = Enum.GetNames(typeof(GeometryType)).Select(name => new OpenApiString(name)).Cast<IOpenApiAny>().ToList() });
});


但是这种类型从来没有出现在我的swagger.json页面中,这让我相信它与.Net创建端点的方式有关。

ttisahbt

ttisahbt1#

首先,你需要确定它是否在正常的web API中工作。如果不工作,请确保将[JsonConverter(typeof(JsonStringEnumConverter))]添加到enum中

[JsonConverter(typeof(JsonStringEnumConverter))]
   public enum GeometryType
   {
       WKT,
       GeoJson
   }

字符串
或者在Program.cs中全局添加JsonStringEnumConverter

builder.Services.AddControllers()
                .AddJsonOptions(options =>
                options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));


然后,必须在参数之前定义[FromQuery]

app.MapGet("/geometry", ([FromQuery] GeometryType? geometryType) =>
{

});


json应该是:

"parameters": [
          {
            "name": "geometryType",
            "in": "query",
            "schema": {
              "enum": [
                "WKT",
                "GeoJson"
              ],
              "type": "string"
            }
          }
        ],


结果:

2guxujil

2guxujil2#

为了确保Swagger(OpenAPI)正确识别枚举类型并提供具有可用选项的转换器,您可以使用**[JsonConverter]**属性为枚举类型指定自定义转换器。
范例:

// Define your enum
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum SampleEnum
{
    Value1,
    Value2,
    Value3
}

// Add the endpoint to your app
builder.MapGet("/sample", (SampleEnum sampleEnum) => $"Selected enum value: {sampleEnum}")
    .ToEndpoint();

字符串
在此代码中,**[JsonConverter(typeof(JsonStringEnumConverter))]**属性应用于SampleEnum枚举。这将指示Swagger在Swagger UI中将枚举表示为字符串,从而允许您在通过Swagger UI测试API时查看具有可用枚举选项的枚举。

相关问题