将查询字符串参数添加到我的Swagger规范中

我使用我的Web API使用Swashbuckle(swagger for C#)。 我有几个返回列表的GET端点,我允许用户在QueryString中添加perpage和page params

示例: http : //myapi.com/endpoint/?page = 5&pagepage = 10

我看到swagger在’query’中确实支持参数但是我如何让Swashbuckle去做呢?


我在其中一条评论中提到我通过创建自定义属性来解决我的问题,以便让我做我需要的事情。 以下是我的解决方案的代码:

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] public class SwaggerParameterAttribute : Attribute { public SwaggerParameterAttribute(string name, string description) { Name = name; Description = description; } public string Name { get; private set; } public Type DataType { get; set; } public string ParameterType { get; set; } public string Description { get; private set; } public bool Required { get; set; } = false; } 

使用Swagger配置注册属性:

 GlobalConfiguration.Configuration .EnableSwagger(c => { c.OperationFilter(); }); 

然后将此属性添加到您的方法:

 [SwaggerParameter("page", "Page number to display", DataType = typeof(Int32), ParameterType = ParameterType.inQuery)] [SwaggerParameter("perpage","Items to display per page", DataType = typeof(Int32), ParameterType = ParameterType.inQuery)] 

你可以很容易地实现这一点。 假设你有一个ItemsController ,其动作如下:

 [Route("/api/items/{id}")] public IHttpActionResult Get(int id, int? page = null, int? perpage = null) { // some relevant code return Ok(); } 

Swashbuckle将生成此规范(仅显示相关部分):

 "paths":{ "/api/items/{id}":{ "get":{ "parameters":[ { "name":"id", "in":"path", "required":true, "type":"integer", "format":"int32" }, { "name":"page", "in":"query", "required":false, "type":"integer", "format":"int32" }, { "name":"limit", "in":"query", "required":false, "type":"integer", "format":"int32" } ] } } 

如果需要pageperpage ,只需使参数不可为空。

这里有一些关于SwaggerParametersAttributeHandler缺失信息的评论。 它是一个操作filter,可帮助您确定如何对属性执行操作。

这是我使用的一个示例处理程序,它允许我使用SwaggerParameterAttribute覆盖可空参数的必填字段。

 public class RequiredParameterOverrideOperationFilter : IOperationFilter { public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { // Get all SwaggerParameterAttributes on the method var attributes = apiDescription.ActionDescriptor.GetCustomAttributes(); if (operation.parameters == null) { operation.parameters = new List(); } // For each attribute found, find the operation parameter (this is where Swagger looks to generate the Swagger doc) // Override the required fields based on the attribute's required field foreach (var attribute in attributes) { var referencingOperationParameter = operation.parameters.FirstOrDefault(p => p.name == attribute.Name); if (referencingOperationParameter != null) { referencingOperationParameter.required = attribute.Required; } } } }