私の「簡略化された」APIでは、すべての応答は基本の「応答」クラスから派生(継承)されます。応答クラスはさ構成されるメタデータで満たされたヘッダ、ユーザが要求しているコアデータを含む体。応答(JSON)は、すべてのメタデータが最初の「レイヤー」にあり、本体が「本体」と呼ばれる単一の属性になるようにレイアウトされています。
response
|--metadata attribute 1 (string/int/object)
|--metadata attribute 2 (string/int/object)
|--body (object)
|--body attribute 1 (string/int/object)
|--body attribute 2 (string/int/object)
この関係を次のJSONを使用してSwaggerで定義しようとしました。
{
...
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
}
}
}
次に、body / headerから継承するさまざまなbody / headerクラスを作成してさまざまな応答を作成し、次に関連するヘッダー/ bodyクラスで構成される子応答クラスを作成しようとします(下部のソースコードに示されています)。ただし、これが間違った方法であるか、私の実装が正しくないことは確かです。swagger 2.0仕様(以下に表示)で継承の例を見つけることができませんでしたが、構成の例を見つけました。
この「弁別器」が大きな役割を果たすことは確かですが、私が何をする必要があるのかはわかりません。
質問
誰かがswagger2.0(JSON)でcomposition + inheritanceを実装する方法を教えてもらえますか?できれば以下のサンプルコードを「修正」してください。また、ヘッダーの「result」属性が常に「error」に設定されている応答から継承するErrorResponseクラスを指定できれば素晴らしいと思います。
{
"swagger": "2.0",
"info": {
"title": "Test API",
"description": "Request data from the system.",
"version": "1.0.0"
},
"host": "xxx.xxx.com",
"schemes": [
"https"
],
"basePath": "/",
"produces": [
"application/json"
],
"paths": {
"/request_filename": {
"post": {
"summary": "Request Filename",
"description": "Generates an appropriate filename for a given data request.",
"responses": {
"200": {
"description": "A JSON response with the generated filename",
"schema": {
"$ref": "#/definitions/filename_response"
}
}
}
}
}
},
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
},
"filename_response": {
"extends": "response",
"allOf": [
{
"$ref": "#definitions/response_header"
},
{
"properties": {
"body": {
"schema": {
"$ref": "#definitions/filename_response_body"
}
}
}
}
]
},
"filename_response_body": {
"extends": "#/definitions/response_body",
"properties": {
"filename": {
"type": "string",
"description": "The automatically generated filename"
}
}
}
}
}
ダイアグラムの更新
必要なものを明確にするために、以下の非常に基本的な図を作成しました。これは、すべての応答が、response_headerオブジェクトとresponse_bodyオブジェクトの任意の組み合わせを使用して(構成)作成された「response」オブジェクトのインスタンス化であることを示すことを目的としています。response_headerオブジェクトとresponse_bodyオブジェクトは、拡張して任意の応答オブジェクトに挿入できます。これは、基本response_bodyクラスのfilename_response_body子を使用するfilename_responseの場合に実行されます。エラー応答と成功応答はどちらも「応答」オブジェクトを使用します。