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

tvmytwxo  于 2024-01-07  发布在  .NET
关注(0)|答案(2)|浏览(371)

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

  1. public enum GeometryType
  2. {
  3. WKT,
  4. GeoJson
  5. }

字符串
和一个端点:

  1. app.MapGet("/geometry", (GeometryType? geometryType) =>
  2. {
  3. };


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

  1. {
  2. "name": "geometryType",
  3. "in": "query",
  4. "schema": {
  5. "type": "string"
  6. }
  7. }


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

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


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

ttisahbt

ttisahbt1#

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

  1. [JsonConverter(typeof(JsonStringEnumConverter))]
  2. public enum GeometryType
  3. {
  4. WKT,
  5. GeoJson
  6. }

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

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


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

  1. app.MapGet("/geometry", ([FromQuery] GeometryType? geometryType) =>
  2. {
  3. });


json应该是:

  1. "parameters": [
  2. {
  3. "name": "geometryType",
  4. "in": "query",
  5. "schema": {
  6. "enum": [
  7. "WKT",
  8. "GeoJson"
  9. ],
  10. "type": "string"
  11. }
  12. }
  13. ],


结果:

展开查看全部
2guxujil

2guxujil2#

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

  1. // Define your enum
  2. [JsonConverter(typeof(JsonStringEnumConverter))]
  3. public enum SampleEnum
  4. {
  5. Value1,
  6. Value2,
  7. Value3
  8. }
  9. // Add the endpoint to your app
  10. builder.MapGet("/sample", (SampleEnum sampleEnum) => $"Selected enum value: {sampleEnum}")
  11. .ToEndpoint();

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

展开查看全部

相关问题