web-dev-qa-db-fra.com

Demande de validation à l'aide d'un framework sans serveur

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).

13
Annie Alan

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 ...

  1. 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
    
  2. 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
23
Nicholas Sizer

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)}
12
Ivan Mushketyk