4

ServiceStackの新しいSwaggerプラグインを使用してSwaggerAPIドキュメントを実装し、「コンテナ」データ型の使用方法を決定しようとしています。サブオブジェクトのリストである所定の値と他のパラメータのリストを含む文字列フィールドを表示する必要があります。

何かが足りない場合を除いて、swaggerは、サブオブジェクトのリストのJSONを入力するテキストフィールドしか取得できないと思います。私はこのコードがうまくいくはずだと信じています。

[ApiMember(Name = "Connections", Description = "insert JSON sample here", ParameterType = "body", DataType = "container", IsRequired = false, Verb = "Post")]

私が知らないのは(そして誰かが私を助けてくれることを望んでいる)、事前設定された値のリストからの文字列フィールドを持つことが可能かどうかです。Swaggerでは、このコードスニペットはこれを行う方法を示しています。

"Pet":{
    "id":"Pet",
    "properties":{
    ...
      "status":{
        "type":"String",
        "description":"pet status in the store",
        "allowableValues":{
          "valueType":"LIST",
          "values":[
            "available",
            "pending",
            "sold"
          ]
        }
      },
      "happiness": {
        "type": "Int",
        "description": "how happy the Pet appears to be, where 10 is 'extremely happy'",
        "allowableValues": {
          "valueType": "RANGE",
          "min": 1,
          "max": 10
        }
      },
      ...

ServiceStack.Api.Swaggerを使用してこれを実現する方法を知っている人はいますか?

4

1 に答える 1

3

私は同じ問題に苦しんでいますが、この機能は現在サポートされていないことに気付きました。モデルを使用してデータを POST または PUT することは基本的にできません。この機能は流動的で開発中なので、todo リストにあると思います。

ソース コードを表示すると、 ResourcesResponseデータ コントラクトModelsでサポートされているプロパティがないことがわかります。

[DataContract]
public class ResourcesResponse
{
    [DataMember(Name = "swaggerVersion")]
    public string SwaggerVersion { get; set; }
    [DataMember(Name = "apiVersion")]
    public string ApiVersion { get; set; }
    [DataMember(Name = "basePath")]
    public string BasePath { get; set; }
    [DataMember(Name = "apis")]
    public List<RestService> Apis { get; set; }
}

これを Wordnik の Petstore の例と比較すると、モデルがルート ノードとして含まれていることがわかります。

{
   "apiVersion":"0.2",
   "swaggerVersion":"1.1",
   "basePath":"http://petstore.swagger.wordnik.com/api",
   "resourcePath":"/pet",
   "apis":[
      {
         "path":"/pet.{format}",
         "description":"Operations about pets",
         "operations":[
            {
               "httpMethod":"POST",
               "summary":"Add a new pet to the store",
               "responseClass":"void",
               "nickname":"addPet",
               "parameters":[
                  {
                     "description":"Pet object that needs to be added to the store",
                     "paramType":"body",
                     "required":true,
                     "allowMultiple":false,
                     "dataType":"Pet"
                  }
               ],
               "errorResponses":[
                  {
                     "code":405,
                     "reason":"Invalid input"
                  }
               ]
            }
         ]
      }
   ],
   "models":{
      "Category":{
         "id":"Category",
         "properties":{
            "id":{
               "type":"long"
            },
            "name":{
               "type":"string"
            }
         }
      },
      "Pet":{
         "id":"Pet",
         "properties":{
            "tags":{
               "items":{
                  "$ref":"Tag"
               },
               "type":"Array"
            },
            "id":{
               "type":"long"
            },
            "category":{
               "type":"Category"
            },
            "status":{
               "allowableValues":{
                  "valueType":"LIST",
                  "values":[
                     "available",
                     "pending",
                     "sold"
                  ],
                  "valueType":"LIST"
               },
               "description":"pet status in the store",
               "type":"string"
            },
            "name":{
               "type":"string"
            },
            "photoUrls":{
               "items":{
                  "type":"string"
               },
               "type":"Array"
            }
         }
      },
      "Tag":{
         "id":"Tag",
         "properties":{
            "id":{
               "type":"long"
            },
            "name":{
               "type":"string"
            }
         }
      }
   }
}

これを回避する唯一の方法は、オブジェクト全体を自分で投稿することだと思います。Pet など、オブジェクト全体を受け取るリクエスト オブジェクトを用意します。とをに設定ParameterTypeします。Swagger インターフェイスには、実際の JSON オブジェクトを貼り付ける必要があるテキストエリアが表示されます。リクエストは次のようになります。bodyDataTypePet

[Api("The Thing Service")]
[Route("/thing", "POST", Summary = @"POST a new thing", Notes = "Send a thing here")]
public class ThingRequest
{
    [DataMember]
    [ApiMember(Name = "Thing", Description = "The thing", ParameterType = "body", DataType = "Thing", IsRequired = false)]
    public ThingDto Thing { get; set; }
}

そして、あなたのサービスは次のようになります:

/// <summary>
/// Summary description for ThingService
/// </summary>
public class ThingService : Service
{
    public IThingRepository ThingRepository { get; set; }

    public object Post(ThingRequest request)
    {
        var thing = Thing.Map(request);
        ThingRepository.Save(thing);
        return new ThingResponse();
    }
}

以下がレンダリングされます。

Swagger 出力

次のようにオブジェクトを入力すると、リクエストが正しく解析されます。

ここに画像の説明を入力

于 2013-02-22T22:43:24.213 に答える