各httpメソッドのプロパティがほとんど同じである複雑なモデルを使用するパスがあります。問題は、PUTおよびPOSTのリクエストにsome必要なプロパティを定義したいのですが、GET応答にはプロパティは必要ありません(サーバーは常にすべてのプロパティを返し、それが言及されているため)ドキュメントの別の場所)。
私が試したことを示すために、簡単な猫APIを作成しました。アイデアは、GET応答の場合、応答モデルには必要なものとしてマークされているものは何もないが、PUTの要求には猫の名前が必要であるということです。
swagger: "2.0"
info:
title: "Cat API"
version: 1.0.0
paths:
/cats/{id}:
parameters:
- name: id
in: path
required: true
type: integer
get:
responses:
200:
description: Return a cat
schema:
$ref: "#/definitions/GetCat"
put:
parameters:
- name: cat
in: body
required: true
schema:
$ref: "#/definitions/PutCat"
responses:
204:
description: Cat edited
definitions:
Cat:
type: object
properties:
name:
type: string
GetCat:
allOf:
- $ref: "#/definitions/Cat"
properties:
id:
type: integer
PutCat:
type: object
required:
- name
properties:
$ref: "#/definitions/Cat/properties"
Swagger Editorによると、これは有効な仕様ですが、name
はGETとPUTの両方で必要に応じて設定されます。 Swagger UIについても同様です。
次のバージョンのPutCatも試しました。
PutCat:
type: object
required:
- name
allOf:
- $ref: "#/definitions/Cat"
しかし、今ではすべてがオプションです。
これはわかりません。これを正しく行う方法はありますか?
編集:
Helen が正しく言及されているように、readOnly
を使用して、GETおよびPUTでこの特定のケースを解決できます。
しかし、PUTに(breed
プロパティに加えて)提供する必要があるname
プロパティを追加するとします。次に、breed
またはname
のいずれかを変更せずに更新するために使用できるPATCHメソッドを追加し、必要に応じてどちらも設定しないようにします。
この例では、GETとPOST/PUTの両方に単一のモデルを使用できます。プロパティは、GET応答でのみ使用され、readOnly
とマークされます。 spec から:
readOnly
プロパティを「読み取り専用」として宣言します。これは、応答の一部として送信される場合がありますが、要求の一部として送信されてはならないことを意味します。 readOnlyがtrueとしてマークされているプロパティは、定義されたスキーマの必須リストに含まれるべきではありません(SHOULD NOT)。デフォルト値はfalseです。
仕様は次のようになります。
get:
responses:
200:
description: Return a cat
schema:
$ref: "#/definitions/Cat"
put:
parameters:
- name: cat
in: body
required: true
schema:
$ref: "#/definitions/Cat"
responses:
204:
description: Cat edited
definitions:
Cat:
properties:
id:
type: integer
readOnly: true
name:
type: string
breed:
type: string
required:
- name
- breed
つまり、name
とbreed
をPUTする必要があります。
{
"name": "Puss in Boots",
"breed": "whatever"
}
およびGET /cats/{id}
はname
およびbreed
を返す必要があり、id
も返す場合があります。
{
"name": "Puss in Boots",
"breed": "whatever",
"id": 5
}
同様の問題がありました。私のインデントが間違っていることが判明しました。次の構文が機能するはずです。
PutCat:
allOf:
- $ref: "#/definitions/Cat"
- type: object
required: [name]