2016-02-18 3 views
5

アップデート: 私はこれはバグが原因であれば疑問に思い始めている:重複パラメータ出力

https://github.com/domaindrivendev/Swashbuckle/issues/590

しかし、回避策は私の問題を解決するために存在していないよう推薦し。


私はSwashbuckleを使用して、C#ASP.NET Web APIプロジェクトのAPIドキュメントを生成しています。 「foo」と「bar」に設定するオプションのパラメータ(パラメータ2)に設定し、必要なパラメータ(PARAM1)で

/endpoint/items/123/foo?param2=bar 

私の目標は、次のように有効なURLを可能にすることです。私は両方のパラメータが単一のC#パラメータオブジェクトの中に含まれていることを望みます。 (param3のような他のオプションのパラメータもあります)。いくつかのエンドポイントは同一のパラメータを使用します。パラメータを表す単一のオブジェクトが必要です。

スワッガー/スワッシュバックルの詳細はほとんどがブラックボックスで、これを理解することはできません。パラメータリストに重複があります。問題再現する

サンプルコード:第二の方法によれ

// This endpoint is generating documentation the way I would like. 
    [HttpGet] 
    [Route("endpoint1/items/{id}/{param1}")] 
    public string GetDataForParameters(int id, string param1, string param2 = null, string param3 = null) 
    { 
     return string.Format("Params: {1}, {2}, {3}", id, param1, param2, param3); 
    } 

    // This endpoint has the structure I would like, but I get duplicates for param1 in the documentation. 
    [HttpGet] 
    [Route("endpoint2/items/{id}/{param1}")] 
    public string GetDataForParameters(int id, [FromUri(Name = "")]MyParams myParams) 
    { 
     return string.Format("Params: {1}, {2}, {3}", id, myParams.Param1, myParams.Param2, myParams.Param3); 
    } 

    public class MyParams 
    { 
     public string Param1 { get; set;} 
     public string Param2 { get; set;} 
     public string Param3 { get; set;} 
    } 

を、Iは、単一のオブジェクト内のパラメータを受け取ります。しかし、Swaggerは "param1"の重複したエントリを表示します。

スクリーンショット:Swagger duplicate parameter

がどのように闊歩/ Swashbuckleは、「パラメータ1」の2番目の項目が表示されないことができますか?


この構造を持つ理由は、異なるタイプのデータを返す複数のエンドポイントがあることですが、共通のパラメータを使用するためです。 いくつかのパラメータは必須であり(IDのprt)、URLにそれらを含めるにはクエリ文字列にオプションのパラメータを含めます。 共通パラメータオブジェクトに必須パラメータとオプションパラメータの両方を含めることをお勧めします。

Visual Studio 2015で作成されたサンプルコードが更新されました。1.デフォルトのASP.NET Web APIプロジェクト。生成されたValuesController.csに上記のコードを追加します。インストールされたパッケージSwashbuckle 5.3.1 +の依存関係。

+0

秒ルータは 'クエリ文字列としてparam1'だけでなく、' MyParams'のメンバーが含まれています。これが理由かもしれない。 –

+0

これは正しいです - 私はURLパスにparam1を指定し、クエリ文字列にはparam2を指定します。これを明確にするために質問を更新します。 – PMBjornerud

+0

更新:回避策としてJsonIgnoreを提案する私自身の答えを削除しました。これにより、Swaggerは正しく見えるようになりましたが、さらに検査すると、生成されたURLが '/ endpoint2/items/123/{Param1}?param1 = foo&param2 = bar'になることに気付きました。私はまだこれに対する解決策を探しています。 – PMBjornerud

答えて

1

更新: 回避方法が見つかりました。それは醜いです:

  1. メソッドに明示的な重複パラメータを導入します。
  2. JsonIgnore属性をパラメータオブジェクトの重複するプロパティに追加します。

スワッガーは、このパラメータとメソッドのパラメータを取得します。 ASP.Netは、メソッド・パラメーターとパラメーター・オブジェクトの両方にパラメーターを割り当て、コードがパラメーター・オブジェクトを使用できるようにします。

/// <param name="param1">URL parameters must be documented on this level.</param> 
    [HttpGet] 
    [Route("endpoint2/items/{id}/{param1}")] 
    public string GetDataForParameters(int id, string param1, [FromUri(Name = "")]MyParams myParams) 
    { 
     // the param1 method parameter is a dummy, and not used anywhere. 
     return string.Format("Params: {1}, {2}, {3}", id, myParams.Param1, myParams.Param2, myParams.Param3); 
    } 

    public class MyParams 
    { 
     /// <summary> 
     /// Cannot add documentation here, it will be ignored. 
     /// </summary> 
     [JsonIgnore] 
     public string Param1 { get; set;} 
     /// <summary> 
     /// This is included. Querystring parameters can be documented in this class. 
     /// </summary> 
     public string Param2 { get; set;} 
     public string Param3 { get; set;} 
    } 

私はこのアプローチを使用しません。このコードを読んでいる他の開発者にとっては、あまりにも混乱します。残念ながら、Swagger/Swashbuckleは私の(完全に動作する)コードを変更して文書を生成するように指示しました。

誰かが適切な解決法を提案できない限り、私は最良の解決策は単純なメソッドパラメータを持つことだと思います。あなたがGet(string param1, string param2 ..)を使用する場合、それは、ルーティングとクエリを見

+0

あなたの回避策は私のために働いた。スワッシュバックルのドキュメントを動作させるには、大文字と小文字が区別されます。 –

0

Swashbuckleはそのswagger.jsonファイルを生成します(これらは= nullに設定されていないため)、自動的にそれらのパラメータが必要であることSwashbuckleを告げるだから パラメータ

Get([FromUri(Name = "")]MyParams myParams)を使用している場合 Swashbuckleは、モデル内のデータアノテーション(System.ComponentModel.DataAnnotations)を検索し、パラメータが必要かどうかを判断します。

セットのParam1が必要とされる

public class MyParams 
    { 
     [Required] 
     public string Param1 { get; set;} 
     public string Param2 { get; set;} 
     public string Param3 { get; set;} 
    } 
+0

これにより、必要に応じて複製も表示されますが、スワッガーはそれを複製として表示してルートを生成します(ルートを「エンドポイント2 /アイテム/ {ID}/{Param1}」とします) '/ {Param1}?param1 = bar&param1 = bar'に似ています。これを心配し始めた – PMBjornerud

+0

はリンクで私の質問を更新するより深刻な問題です。 – PMBjornerud

+0

@PMBjornerudパラメタが既にルーティングパラメータに入っているとき、そのモデルのparam1はなぜですか? – VisualBean