2016-03-06 23 views
5

Web API'm ile Swashbuckle (C# için swagger) kullanıyorum. Ben listeleri dönmek birkaç GET sonu puanı var ve kullanıcı QueryString içine perpage ve sayfa params eklemesine izinSorgu Dizesi Param'ları Benim Swagger Özellikleri'ne Ekleme

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

O dayı 'sorguda' destek parametresini yapar görüyoruz ama nasıl Swashbuckle'ın yapmasını sağlıyorum? Ben özel bir oluşturarak sorunumu çözdü yorumların birinde söz


bana gerekli yapmak için izin vermek bağlıyor.

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

Sonra yöntemlere bu özelliği eklemelerini:

[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

'SwaggerParametersAttributeHandler' nerededir? : s –

+0

Darn, görünüşe göre 'ParameterType' enum da eksik. Bizim için boşlukları doldurmak için istekli olabilecek bir ihtimal var mı? ': D' –

cevap

5

Bunu oldukça elde edebilirsiniz

[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 Config ile Özellik Kayıt: Aşağıda benim çözüm için koddur kolayca.

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

(yalnızca ilgili kısmını gösteren):

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

gerekli olan page ve perpage istiyorum, sadece yapmak böyle bir eylem ile bir ItemsController olduğunu varsayalım parametreler null değil.

+0

Bu çok mantıklı bir cevap ancak ben bunu işlemek için özel bir Swagger Özniteliği yaratma bittim –

+0

Bu @JasonH nasıl elde ettiniz? Kaynaklar çevrimiçi, bahsettiğiniz bir çözümü işaret edebilir mi? –

+0

Üzerinde çalıştığım kod kendime ait değil, yarattığım özniteliği paylaşmadım. Orijinal sorumu, yaptığım şeyle düzenleyebilirim, böylece görebilirsiniz. –

0

Burada SwaggerParametersAttributeHandler hakkında eksik bilgilerle ilgili bazı yorumlar var. Özniteliklerinize neler yapacağınızı belirlemenize yardımcı olacak bir işlem filtresi.

Aşağıdaki örnekte, kullanacağım parametrelerin gerekli alanlarını SwaggerParameterAttribute kullanarak geçersiz kılmama izin veren bir örnekleyici kullanıyorum.

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