Benim "basitleştirilmiş" API'mde, tüm yanıtlar temel bir "yanıt" sınıfından türetilir ( miras alınır ). Tepki sınıfı olan oluşan meta ile dolu bir başlık, ve kullanıcı talep çekirdeğin verileri içeren gövdenin. Yanıt (JSON'da), tüm meta veriler ilk "katman" üzerinde olacak ve gövde, "gövde" adı verilen tek bir özellik olacak şekilde düzenlenmiştir.
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)
Bu ilişkiyi aşağıdaki JSON ile havalı olarak tanımlamaya çalıştım:
{
...
"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"
}
}
}
Daha sonra gövde / başlıktan miras alan çeşitli gövde / başlık sınıflarını oluşturarak farklı yanıtlar oluşturmaya ve ardından ilgili başlık / gövde sınıflarından oluşan çocuk yanıt sınıfları oluşturmaya çalışıyorum (altta kaynak kodda gösterilmiştir). Ancak, bunun bir şeyleri yapmanın yanlış yolu olduğundan veya uygulamamın yanlış olduğundan eminim. Swagger 2.0 spesifikasyonunda (aşağıda gösterilmektedir) bir kalıtım örneği bulamadım, ancak bir kompozisyon örneği buldum .
Bu "ayırt edicinin" oynayacak büyük bir rolü olduğundan oldukça eminim, ancak ne yapmam gerektiğinden emin değilim.
Soru
Birisi bana, tercihen aşağıdaki örnek kodumu "düzelterek" swagger 2.0'da (JSON) kompozisyon + kalıtımın nasıl uygulanacağını gösterebilir mi? Ayrıca, başlıktaki "sonuç" özniteliğinin her zaman "hata" olarak ayarlandığı yanıttan miras alan bir ErrorResponse sınıfı belirtebilseydim harika olurdu.
{
"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"
}
}
}
}
}
Diyagram Güncellemesi
Ne istediğimi denemek ve açıklığa kavuşturmak için, aşağıdaki tüm yanıtların herhangi bir response_header ve response_body nesneleri kombinasyonu kullanılarak (kompozisyon) tarafından oluşturulan "yanıt" nesnesinin somutlaştırmaları olduğunu göstermeyi amaçlayan çok basit diyagramı oluşturdum. Response_header ve response_body nesneleri, temel response_body sınıfının filename_response_body alt öğesini kullanan bir filename_response durumunda yapılan herhangi bir yanıt nesnesine genişletilebilir ve eklenebilir. Hem hata hem de başarılı yanıtlar "yanıt" nesnesini kullanır.