Search code examples
c#swaggerswashbuckle

Adding Query String Params to my Swagger Specs


I am using Swashbuckle (swagger for C#) with my Web API. I have several GET End-Points that return lists and I allow the user to add a perpage and page params into the QueryString

Example: http://myapi.com/endpoint/?page=5&perpage=10

I see that swagger does support parameter in 'query' but how do I get Swashbuckle to do it?


I mention in one of the comments that I solved my issue by creating a custom attribute to allow me to do what I needed. Below is the code for my solution:

[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;
}

Register the Attribute with the Swagger Config:

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

Then add this attribute to your methods:

[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)]

Solution

  • You can achieve that quite easily. Suppose you have an ItemsController with an action like this:

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

    Swashbuckle will generate this specification (only showing relevant part):

    "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"
               }
            ]
         }
      }
    

    When you want page and perpage to be required, just make the parameters not nullable.