15

Web API で Swashbuckle (C# のスワガー) を使用しています。リストを返す GET エンドポイントがいくつかあり、ユーザーがページごとのパラメーターとページ パラメーターを QueryString に追加できるようにします。

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

Swagger が「クエリ」のパラメーターをサポートしていることがわかりますが、Swashbuckle でそれを行うにはどうすればよいですか?


コメントの 1 つで、カスタム属性を作成して必要なことを実行できるようにすることで問題を解決したことを述べています。以下は私のソリューションのコードです:

[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 に登録します。

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

次に、この属性をメソッドに追加します。

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

3 に答える 3

10

それは非常に簡単に達成できます。ItemsController次のようなアクションを持つ があるとします。

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

Swashbuckle はこの仕様を生成します (関連部分のみを表示):

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

必要pageperpage場合は、パラメーターを null 不可にするだけです。

于 2016-03-08T21:12:00.783 に答える
0

SwaggerParametersAttributeHandler に関する欠落情報に関するコメントがいくつかあります。これは、属性に対して何を行うかを決定するのに役立つ操作フィルターです。

以下は、SwaggerParameterAttribute を使用して null 許容パラメーターの必須フィールドをオーバーライドできるようにする、私が使用したハンドラーの例です。

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;
            }
        }
    }
}
于 2017-12-08T16:28:34.753 に答える