J'utilise un framework sans serveur pour le backend. Comment puis-je implémenter la validation des demandes? (ne pas vouloir écrire de validation dans les fonctions lambda).
Pour implémenter la validation des demandes à l'aide de serverless
, vous devez effectuer quelques opérations: inclure vos définitions de modèle/en-tête dans votre pile, puis indiquer à la passerelle API de les utiliser pour la validation des demandes.
Vous devrez installer les packages suivants:
Et puis vous devrez les inclure dans votre serverless.yml
:
plugins:
- serverless-reqvalidator-plugin
- serverless-aws-documentation
Remarque: ci-dessous n'est qu'un aperçu rapide de la façon d'incorporer les packages. Visitez les pages de documentation des packages pour des exemples plus complets ...
Fournissez une passerelle API avec une description de vos modèles/en-têtes.
Vous pouvez importer des schémas json pour vos modèles et déclarer des en-têtes http à l'aide de serverless-aws-documentation
brancher. Voici comment ajouter un modèle à votre serverless.yml
:
custom:
documentation:
api:
info:
version: v0.0.0
title: Some API title
description: Some API description
models:
- name: SomeLambdaRequest
contentType: application/json
schema: ${file(models/SomeLambdaRequest.json)} # reference to your model's json schema file. You can also declare the model inline.
Et voici comment vous référeriez le modèle dans votre définition lambda:
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
documentation:
summary: some summary
description: some description
requestBody:
description: some description
requestModels:
application/json: SomeLambdaRequest
Vous pouvez également déclarer des en-têtes de demande par rapport à votre définition lambda comme ceci:
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
documentation:
summary: some summary
description: some description
requestHeaders:
- name: x-some-header
description: some header value
required: true # true or false
- name: x-another-header
description: some header value
required: false # true or false
Dites à la passerelle API d'utiliser réellement les modèles pour la validation
Cette partie utilise le serverless-reqvalidator-plugin
package, et vous devez ajouter AWS::ApiGateway::RequestValidator
ressources à votre serverless.yml
fichier. Vous pouvez spécifier si vous souhaitez valider le corps de la demande, les en-têtes de demande ou les deux.
resources:
Resources:
onlyBody:
Type: AWS::ApiGateway::RequestValidator
Properties:
Name: 'only-body'
RestApiId:
Ref: ApiGatewayRestApi
ValidateRequestBody: true # true or false
ValidateRequestParameters: false # true or false
Et puis sur les fonctions individuelles, vous pouvez utiliser le validateur comme ceci:
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
reqValidatorName: onlyBody # reference and use the 'only-body' request validator
Ensemble, votre définition lambda finirait par ressembler un peu à ceci:
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
reqValidatorName: onlyBody # reference and use the 'only-body' request validator
documentation:
summary: some summary
description: some description
requestBody:
description: some description
requestModels:
application/json: SomeLambdaRequest
requestHeaders:
- name: x-some-header
description: some header value
required: true # true or false
- name: x-another-header
description: some header value
required: false # true or false
Ceci est désormais pris en charge par le framework Serverless, il n'est donc pas nécessaire d'utiliser des plugins externes.
Pour activer la validation des demandes, il faut ajouter ce qui suit au serverless.yml
:
HttpHandler:
handler: src/lambda/http/create.handler
events:
- http:
method: post
path: items
request:
schema:
application/json: ${file(models/create-todo-model.json)}