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

Jas*_*n H 7 c# swagger swashbuckle

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

示例:http://myapi.com/endpoint/?page = 5&eachpage = 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;
}
Run Code Online (Sandbox Code Playgroud)

使用Swagger配置注册属性:

GlobalConfiguration.Configuration 
    .EnableSwagger(c =>
        {
            c.OperationFilter<SwaggerParametersAttributeHandler>();
        });
Run Code Online (Sandbox Code Playgroud)

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

[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)]
Run Code Online (Sandbox Code Playgroud)

ven*_*rik 6

你可以很容易地实现这一目标.假设您有一个这样ItemsController的动作:

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

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"
           }
        ]
     }
  }
Run Code Online (Sandbox Code Playgroud)

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


小智 5

以下是 Attribute 方法所需步骤的摘要(ASP.Net Core 2.1、Swashbuckle.AspNetCore v4.0.1)。我需要一个以“$”开头的参数,所以可选参数不是一个选项!

SwaggerParameterAttribute.cs

     [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 string DataType { get; set; }
        public string ParameterType { get; set; }
        public string Description { get; private set; }
        public bool Required { get; set; } = false;
    }
Run Code Online (Sandbox Code Playgroud)

SwaggerParameterAttributeFilter.cs

using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;
public class SwaggerParameterAttributeFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        var attributes = context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .Union(context.MethodInfo.GetCustomAttributes(true))
            .OfType<SwaggerParameterAttribute>();

        foreach (var attribute in attributes)
            operation.Parameters.Add(new NonBodyParameter
            {
                Name = attribute.Name,
                Description = attribute.Description,
                In = attribute.ParameterType,
                Required = attribute.Required,
                Type = attribute.DataType
            });              
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Startup.ConfigureServices 中添加这个

 using Swashbuckle.AspNetCore.Swagger;
 services.AddSwaggerGen(c =>
 {
      c.OperationFilter<SwaggerParameterAttributeFilter>();
      c.SwaggerDoc("v1.0", new Info { Title = "My API", Version = "v1.0" });
 });
Run Code Online (Sandbox Code Playgroud)

并像这样使用:

[SwaggerParameter("$top", "Odata Top parameter", DataType = "integer", ParameterType ="query")]
Run Code Online (Sandbox Code Playgroud)

数据类型可以是:整数、字符串、布尔值

ParameterTypes:可以是路径、正文、查询