2016-03-06 9 views
5

Sto utilizzando Swashbuckle (swagger per C#) con la mia API Web. Ho diversi GET finali Punti che restituiscono elenchi e permetto all'utente di aggiungere un PerPage e pagina params nella QueryStringAggiunta di Params String di query alle specifiche Swagger

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

vedo che spavalderia fa parametro sostegno 'query', ma come faccio Ottengo Swashbuckle per farlo?


Ho menzionato in uno dei commenti che ho risolto il problema creando un attributo personalizzato per consentirmi di fare ciò di cui avevo bisogno. Di seguito è riportato il codice per la mia soluzione:

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

registrare l'attributo con lo Swagger Config:

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

Quindi aggiungere questo attributo per i vostri metodi:

[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

Da dove proviene 'SwaggerParametersAttributeHandler'? : s –

+0

Darn, apparentemente manca anche l'enum di 'ParameterType'. Qualche possibilità che vorresti riempire gli spazi vuoti per noi? ': D' –

risposta

5

è possibile ottenere che molto facilmente. Supponiamo di avere un ItemsController con un'azione simile a questo:

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

Swashbuckle genererà questa specifica (che mostra solo una parte rilevante):

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

Quando si desidera page e perpage ad essere richiesto, basta fare il parametri non annullabili.

+0

Questa è una risposta molto ragionevole, ma alla fine ho creato un attributo Swagger personalizzato per gestirlo. –

+0

Come hai ottenuto @JasonH? Le fonti online possono indicare una soluzione come quella che hai menzionato? –

+0

Il codice su cui stavo lavorando non è di mia proprietà, quindi non ho condiviso l'attributo che ho creato. Posso modificare la mia domanda originale con quello che ho fatto in modo che tu possa vedere. –

0

Qui ci sono alcuni commenti riguardanti le informazioni mancanti su SwaggerParametersAttributeHandler. È un filtro operativo per aiutarti a determinare cosa fare ai tuoi attributi.

Ecco un gestore di esempio che ho utilizzato per consentirmi di sovrascrivere i campi obbligatori dei valori nulla utilizzando lo 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<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; 
      } 
     } 
    } 
} 
Problemi correlati