是否可以在Swagger JSON定义中隐藏路线的自定义属性?我有另一个调用API的应用程序,它读取Swagger以获得更多信息。
例如,我想指出该路由需要Active Directory。调用应用程序将执行验证以确保AD可用。
我查看了OperationsFilter,但是它将Parameter插入到Swagger定义中。我还考虑过使用Tag,但它无法实现我所需的功能,并且与UI混淆。
我们在.NET Core 2.0项目中使用Swagger注释。理想情况下,我想通过注释来做到这一点,但没有找到我可以使用的任何东西。
[HttpGet]
[Route("api/")]
[SwaggerOperation(
Summary = "Some Service",
Description = "Some Service",
OperationId = "getMyStuff",
Tags = new[] { "MyStuff" }
)]
[SwaggerResponse(200, "Response object returned")]
[SwaggerResponse(400, "Response object returned")]
public ActionResult<Response> GetStuff()
{...code here...}
答案 0 :(得分:0)
我找到了答案。基本上,我要添加一个特定于路由的扩展。
定义自定义属性类
// allow mutliple attributes specified in data annotations
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
// model for custom attribute class
public class CustomAttribute : Attribute
{
public string ParameterName { get; set; }
public string Value { get; set; }
public string Description { get; set; }
public CustomAttribute(string parameterName, string value, string description = null)
{
this.ParameterName = parameterName;
this.Value = value;
this.Description = description;
}
}
创建摇摇欲坠的操作过滤器
public class CustomAttributeOperationFilter : IOperationFilter
{
// variables
MethodInfo _methodInfo;
public void Apply(Operation operation, OperationFilterContext context)
{
context.ApiDescription.TryGetMethodInfo(out _methodInfo);
var attributes = _methodInfo.GetCustomAttributes<CustomAttribute>();
foreach (var atrib in attributes)
operation.Extensions.Add(atrib.ParameterName, atrib.Value);
}
}
在startups.cs中,更新招摇注册以包括自定义操作过滤器
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("helloworld", new Info {Title = "HelloWorld API"});
c.EnableAnnotations();
c.OperationFilter<CustomAttributeOperationFilter>();
});
最后,在API定义中指定自定义属性
[HttpGet]
[CustomAttribute("x-accept-apples, "yes")]
[CustomAttribute("x-accept-pears, "no")]
public ActionResult<Response> Get()
{
return Ok();
}