2017-02-01 1 views
1

У меня есть конечная точка ASP.Net Web API 2, которая поддерживает запросы OData. Это как таковое:Есть ли способ получить Swashbuckle для добавления параметров OData в Web API 2 IQueryable <T> endpoint?

[HttpGet, Route("")] 
public IQueryable<Thing> Get() 
{ 
    return _thingsRepository.Query(); 
} 

Параметр параметра OData $ filter и такая работа отлично. Я просто хочу, чтобы они появились в Swagger, как и для реальных контроллеров OData.

Я использую Swashbuckle.OData ... но я действительно не уверен, что он покупает мне что-нибудь в этом случае.

ответ

3

Оказывается, довольно легко добавить любые параметры, которые вы хотите использовать, используя SwashBuckle, используя IOperationFilter. Вы можете добавить его в свою конфигурацию Swagger, используя c.OperationFilter<ODataParametersSwaggerDefinition>();. Я создал тот, который добавляет некоторые параметры OData ко всем конечным точкам IQueryable в моем API:

/// <summary> 
///  Add the supported odata parameters for IQueryable endpoints. 
/// </summary> 
public class ODataParametersSwaggerDefinition : IOperationFilter 
{ 
    private static readonly Type QueryableType = typeof(IQueryable); 

    /// <summary> 
    ///  Apply the filter to the operation. 
    /// </summary> 
    /// <param name="operation">The API operation to check.</param> 
    /// <param name="schemaRegistry">The swagger schema registry.</param> 
    /// <param name="apiDescription">The description of the api method.</param> 
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) 
    { 
     var responseType = apiDescription.ResponseType(); 

     if (responseType.GetInterfaces().Any(i => i == QueryableType)) 
     { 
      operation.parameters.Add(new Parameter 
      { 
       name = "$filter", 
       description = "Filter the results using OData syntax.", 
       required = false, 
       type = "string", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$orderby", 
       description = "Order the results using OData syntax.", 
       required = false, 
       type = "string", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$skip", 
       description = "The number of results to skip.", 
       required = false, 
       type = "integer", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$top", 
       description = "The number of results to return.", 
       required = false, 
       type = "integer", 
       @in = "query" 
      }); 

      operation.parameters.Add(new Parameter 
      { 
       name = "$count", 
       description = "Return the total count.", 
       required = false, 
       type = "boolean", 
       @in = "query" 
      }); 
     } 
    } 
} 
Смежные вопросы