2016-03-06 9 views
5

Ich verwende Swashbuckle (Prahlerei für C#) mit meiner Web API. Ich habe mehrere GET End-Points, die Listen zurückkehren und ich kann der Benutzer eine perpage und Seite params in der Abfrage-ZeichenfolgeHinzufügen von Query String Params zu meinen Swagger Specs

Beispiel hinzuzufügen: http://myapi.com/endpoint/?page=5&perpage=10

Ich sehe, dass Prahlerei tut Unterstützung Parameter in ‚query‘ aber wie Ich bekomme Swashbuckle, es zu tun?


ich in einer der Kommentare erwähnen, dass ich mein Problem gelöst, indem eine benutzerdefinierte Erstellung Attribut mir zu erlauben, zu tun, was ich brauchte. Unten ist der Code für meine Lösung:

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

das Attribut mit dem Swagger Config registrieren:

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

Dann dieses Attribut auf Ihre Methoden hinzufügen:

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

Woher kommt 'SwaggerParametersAttributeHandler'? : s –

+0

Darn, anscheinend fehlt auch die 'ParameterType'-Enumeration. Gibt es eine Chance, dass du bereit bist, die Lücken für uns zu füllen? ': D' –

Antwort

5

Sie, dass ganz erreichen können leicht. Angenommen, Sie haben einen ItemsController mit einer Aktion wie folgt aus:

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

Swashbuckle diese Spezifikation generieren (nur relevante Teil angezeigt):

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

Wenn Sie page und perpage wollen erforderlich werden, so stellen die Parameter können nicht nullbar sein.

+0

Das ist eine sehr vernünftige Antwort, aber ich habe am Ende ein benutzerdefiniertes Swagger-Attribut erstellt, um damit umzugehen. –

+0

Wie hast du das @JasonH erreicht? Sind Quellen online, die auf eine Lösung hinweisen können, wie Sie sie erwähnt haben? –

+0

Der Code, an dem ich gerade arbeitete, gehört nicht mir selbst, daher habe ich das von mir erstellte Attribut nicht geteilt. Ich kann meine ursprüngliche Frage mit dem bearbeiten, was ich gemacht habe, damit Sie sehen können. –

0

Es gibt einige Kommentare zu fehlenden Informationen zum SwaggerParametersAttributeHandler. Es ist ein Operationsfilter, mit dem Sie bestimmen können, was Sie mit Ihren Attributen tun können.

Hier ist ein Beispiel für einen Handler, mit dem ich die erforderlichen Felder der Nullable-Parameter mithilfe des SwaggerParameterAttribute überschreiben kann.

public class RequiredParameterOverrideOperationFilter : IOperationFilter 
{ 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     // Get all SwaggerParameterAttributes on the method 
     var attributes = apiDescription.ActionDescriptor.GetCustomAttributes<SwaggerParameterAttribute>(); 

     if (operation.parameters == null) 
     { 
      operation.parameters = new List<Parameter>(); 
     } 

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