如何在不同的控制器上添加单个标头。 E.g:
控制器名称:Controller1, 自定义标题:标题1
控制器名称:Controller2, 自定义标题:标题2
应显示特定控制器下所有api的标题
答案 0 :(得分:7)
这可以通过在您的swagger配置中添加OperationFilter来解决。
首先,您必须提供一个实现IOperationFilter
的类。 Apply
方法接收Operation
参数,该参数包含tag
字段中的控制器名称。呈现Swagger UI时,将为API中的每个方法调用Apply
方法。您甚至可以为每个API方法提供单独的参数,因为Operation
还包含operationId。
public class AddRequiredHeaderParameter : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
if (operation.parameters == null)
operation.parameters = new List<Parameter>();
if (operation.tags[0]?.CompareTo("Example") == 0)
{
operation.parameters.Add(new Parameter
{
name = "X-ExampleParam",
@in = "header",
@default = "42", // optional default value, can be omitted
type = "string",
description = "My special parameter for the example API",
required = true
});
}
else if (operation.tags[0]?.CompareTo("Whatever") == 0)
{
// add other header parameters here
}
}
}
在调试器中,使用名为ExampleController
的控制器,它看起来像这样:
Swagger UI中的结果是一个特殊参数,仅适用于我的示例控制器的API:
通过在Register
类的SwaggerConfig
方法中添加一行来告诉Swagger使用您的OperationFilter:
public class SwaggerConfig
{
public static void Register(HttpConfiguration config)
{
var thisAssembly = typeof(SwaggerConfig).Assembly;
//GlobalConfiguration.Configuration
config
.EnableSwagger(c =>
{
... // omitted some lines here
c.OperationFilter<AddRequiredHeaderParameter>(); // Add this line
... // omitted some lines here
})
}
这个解决方案的想法是基于ShaTin的回答:How to send custom headers with requests in Swagger UI?