asp.net-core - 如何在 ASP.NET Core 3 和 Swashbuckle 5 中为 ProblemDetails 编写 ISchemaFilter?
问题描述
我正在使用带有 Swashbuckle 5 的 ASP.NET Core 3.0。我正在尝试在 ASP.NET Core 3.0 中编写一个ISchemaFilter
for ProblemDetails
。ProblemDetails
为许多不同的状态代码返回,例如 400、401、403、406、415、500 等。我想提供一个ProblemDetails
取决于状态代码的不同示例。我怎样才能做到这一点?这是我编写的一些代码,只需填写空白即可:
public class ProblemDetailsSchemaFilter : ISchemaFilter
{
private static readonly OpenApiObject Status400ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.1"),
["title"] = new OpenApiString("Bad Request"),
["status"] = new OpenApiInteger(StatusCodes.Status400BadRequest),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
["errors"] = new OpenApiObject()
{
["property1"] = new OpenApiArray()
{
new OpenApiString("The property field is required"),
},
},
};
private static readonly OpenApiObject Status401ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7235#section-3.1"),
["title"] = new OpenApiString("Unauthorized"),
["status"] = new OpenApiInteger(StatusCodes.Status401Unauthorized),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status403ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.3"),
["title"] = new OpenApiString("Forbidden"),
["status"] = new OpenApiInteger(StatusCodes.Status403Forbidden),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status404ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.4"),
["title"] = new OpenApiString("Not Found"),
["status"] = new OpenApiInteger(StatusCodes.Status404NotFound),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status406ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.6"),
["title"] = new OpenApiString("Not Acceptable"),
["status"] = new OpenApiInteger(StatusCodes.Status406NotAcceptable),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status409ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.8"),
["title"] = new OpenApiString("Conflict"),
["status"] = new OpenApiInteger(StatusCodes.Status409Conflict),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status415ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.5.13"),
["title"] = new OpenApiString("Unsupported Media Type"),
["status"] = new OpenApiInteger(StatusCodes.Status415UnsupportedMediaType),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status422ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc4918#section-11.2"),
["title"] = new OpenApiString("Unprocessable Entity"),
["status"] = new OpenApiInteger(StatusCodes.Status422UnprocessableEntity),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
private static readonly OpenApiObject Status500ProblemDetails = new OpenApiObject()
{
["type"] = new OpenApiString("https://tools.ietf.org/html/rfc7231#section-6.6.1"),
["title"] = new OpenApiString("Internal Server Error"),
["status"] = new OpenApiInteger(StatusCodes.Status500InternalServerError),
["traceId"] = new OpenApiString("00-982607166a542147b435be3a847ddd71-fc75498eb9f09d48-00"),
};
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (context.ApiModel.Type == typeof(ProblemDetails))
{
// TODO: Set the default and example based on the status code.
// schema.Default = ???;
// schema.Example = ???;
}
}
}
解决方案
这是一个简单的解决方法,如下所示:
1.型号:
public class ProblemDetails
{
public int ID { get; set; }
public string Description { get; set; }
}
2.ProblemDetailsSchemaFilter:
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (context.ApiModel.Type == typeof(ProblemDetails))
{
// TODO: Set the default and example based on the status code.
schema.Default = new OpenApiObject
{
["ID"] = new OpenApiInteger(2),
["Description"] = new OpenApiString("test")
};
schema.Example = new OpenApiObject
{
["ID"] = new OpenApiInteger(1),
["Description"] = new OpenApiString("test test")
};
}
}
3.启动.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
c.SchemaFilter<ProblemDetailsSchemaFilter>();
});
}
推荐阅读
- barcode - 条码的准确性
- r - 如何将 3 个子向量直接融合为 1 个
- python - 在迭代列表时执行操作
- html - 如果类型是文本,则带有 enterkeyhint 的 HTML 移动 Web 输入不关注下一个输入
- python - 如何根据python中的某些条件对负值应用日志
- r - 用协变量计算不同样本量组之间的平均差
- python - 过滤 Django 中的多对多字段未按预期工作
- javascript - http fetch 调用的事务行为
- warnings - 警告消息:在矩阵中(unlist(drop.item),ncol = 10,byrow = TRUE):数据长度 [16] 不是列数 [10] >?
- python - keras 模型在使用 load_model 加载模型后要求编译