मेरे "सरलीकृत" एपीआई में, सभी प्रतिक्रियाएं एक आधार "प्रतिक्रिया" वर्ग से ली गई हैं ( विरासत )। प्रतिक्रिया वर्ग मेटाडेटा से भरे एक हेडर से बना होता है, और शरीर जिसमें उपयोगकर्ता का मुख्य डेटा होता है, अनुरोध करता है। प्रतिक्रिया (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 के साथ स्वैगर में इस संबंध को परिभाषित करने की कोशिश की है:
{
...
"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"
}
}
}
फिर मैं विभिन्न बॉडी / हेडर क्लासेस बनाकर अलग-अलग प्रतिक्रियाएँ बनाने की कोशिश करता हूँ जो बॉडी / हेडर से विरासत में मिलती हैं, और फिर बच्चे के रिस्पॉन्स क्लासेस बनाते हैं जो प्रासंगिक हेडर / बॉडी क्लासेस (नीचे सोर्स कोड में दिखाया गया है) से बना होता है। हालाँकि, मैं निश्चित हूं कि या तो यह काम करने का गलत तरीका है, या यह कि मेरा कार्यान्वयन गलत है। मैं स्वैगर 2.0 विनिर्देश (नीचे दिखाए गए) में वंशानुक्रम का एक उदाहरण खोजने में असमर्थ रहा हूं, लेकिन रचना का एक उदाहरण मिला है ।
मुझे पूरा यकीन है कि इस "विभेदकारी" के पास खेलने के लिए एक बड़ा हिस्सा है, लेकिन यह निश्चित नहीं है कि मुझे क्या करने की आवश्यकता है।
सवाल
क्या कोई मुझे दिखा सकता है कि स्वैगर 2.0 (JSON) में कंपोजीशन + इनहेरिटेंस लागू करने का तरीका कैसा है, अधिमानतः नीचे मेरा उदाहरण कोड "फिक्सिंग" करके। यह भी बहुत अच्छा होगा अगर मैं एक 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_body वस्तुओं के संयोजन का उपयोग करके (रचना) द्वारा बनाई गई हैं। Response_header और response_body ऑब्जेक्ट्स को बढ़ाया जा सकता है और किसी भी प्रतिक्रिया ऑब्जेक्ट में डाला जा सकता है, जो कि एक filename_response के मामले में किया जाता है जो आधार response_body वर्ग के filename_response_body बच्चे का उपयोग करता है। त्रुटि और सफल प्रतिक्रिया दोनों "प्रतिक्रिया" ऑब्जेक्ट का उपयोग करते हैं।