amazon web services - services - definiciones de modelos de documentación sin servidor con campos opcionales?
lambda aws (2)
Quiero definir modelos de solicitud y respuesta. Uso el Framework Serverless con AWS y todo lo que veo recomienda el uso de la documentación sin servidor-aws
El README dice que necesito tener esta línea en custom.documentation.models.MODELNAME
schema: ${file(models/error.json)}
Pero no tienen un archivo de ejemplo de models/error.json
para usar como referencia.
En el ejemplo real serverless.yml tienen una definición como esta:
-
name: DoSomethingRequest
contentType: "application/json"
schema:
type: array
items:
type: string
Esto no proporciona suficientes detalles para lo que estoy tratando de hacer.
Mi objetivo es tener un esquema definido para una matriz de objetos de cadena, un mensaje y un código de estado. Sin embargo, el mensaje y el código de estado son opcionales. Estos también podrían ser parte de otros modelos y, si es posible, me gustaría no repetir su definición para cada modelo.
Mi intento actual es:
-
name: ReturnArrayResponse
contentType: "application/json"
schema:
type: array
itemsArray:
type: string
message:
type: string
statusCode:
type: number
Creo que esto va a hacer lo que quiero, pero ¿cómo puedo tener message
y statusCode
ser opcionales y repetir estos dos elementos en mis otros modelos?
Estaría contento con una solución yml que puedo poner en mi archivo serverless.yml o un archivo json al que pueda hacer referencia.
Solo una suposición (publicarlo como una respuesta para conservar el formato): su entidad de nivel superior en el esquema debe ser un object
, no una array
, algo como esto:
schema:
type: object
properties:
items:
type: array
items:
type: string
message:
type: string
statusCode:
type: number
Incluyendo un archivo
En el ejemplo dado, error.json
puede contener cualquier esquema válido. Entonces algo tan simple como esto está bien:
{"type":"object","properties":{"message":{"type":"string"}}}
También está bien incluir atributos como $schema
y title
:
{
"$schema" : "http://json-schema.org/draft-04/schema#",
"title" : "Error Schema",
"type" : "object",
"properties" : {
"message" : { "type" : "string" },
"statusCode": { "type": "number" },
"itemsArray": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
Esto es especialmente útil cuando tiene modelos ya definidos en AWS, pero no tiene el yaml sin servidor para compilarlos. Simplemente puede copiar el esquema de la consola de AWS, pegar el json en un archivo y usar la sintaxis del schema: ${file()}
menciona en la pregunta. Por lo que puedo decir, todo lo que pueda conseguir que acepte la consola de AWS funcionará.
SECO
No conozco una forma de referenciar modelos de otros modelos en un archivo sin servidor, pero podría usar el mismo enfoque que los autores de los complementos, y simplemente colocar todo lo que necesite volver a utilizar fuera de los models
y en algún lugar sea más fácil de reutilizar. . Los autores del complemento usan commonModelSchemaFragments
.
Entonces, si tienes algunos fragmentos así:
commonModelSchemaFragments:
# defining common fragments means you can reference them with a single line
StringArrayFragment:
type: array
items:
type: string
HttpResponse:
type: object
properties:
message:
type: string
statusCode:
type: number
Puede hacer referencia a esos fragmentos en modelos como este:
-
name: HttpStatusResponse
contentType: "application/json"
schema:
type: object
properties:
serverResponse:
${self:custom.commonModelSchemaFragments.HttpResponse}
messageArray:
${self:custom.commonModelSchemaFragments.StringArrayFragment}
Marcado de atributos opcionales
Puede lograr esto marcando atributos según sea required
. Simplemente proporcione una lista de todos los atributos, excepto los que desea que sean opcionales . El esquema json para eso se ve así:
{
"type": "object",
"required": ["message"],
"properties": {
"optionalMessage": {
"type": "string"
},
"message": {
"type": "string"
}
}
}
que construirías usando yall así en tu archivo sin servidor:
-
name: OptionalResponse
contentType: "application/json"
schema:
type: object
required:
- "message"
properties:
message:
type: string
optionalMessage:
type: string
Nota sobre la validación de solicitud
Marcar los atributos required
u optional
solo importa si la validación del cuerpo de la solicitud está activada:
No sé de una forma de activar la validación de solicitud utilizando cualquier sintaxis especial sin servidor. Parece que puede hacer esto en la sección de resources
, pero no lo he intentado. Fuente