Imposta la convalida delle richieste di base in API Gateway - Amazon API Gateway

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Imposta la convalida delle richieste di base in API Gateway

Questa sezione mostra come configurare la convalida delle richieste per API Gateway utilizzando la console e una definizione apertaAPI. AWS CLI

Imposta la convalida delle richieste utilizzando la API console Gateway

È possibile utilizzare la console API Gateway per convalidare una richiesta selezionando uno dei tre validatori per una richiesta: API

  • Convalida del corpo.

  • Convalida dei parametri e delle intestazioni delle stringhe di query.

  • Convalida del corpo, dei parametri delle stringhe di query e delle intestazioni.

Quando applichi uno dei validatori a un API metodo, la console API Gateway aggiunge il validatore alla mappa. API RequestValidators

Per seguire questo tutorial, utilizzerai un AWS CloudFormation modello per creare un Gateway incompletoAPI. API Questo API ha una /validator risorsa con GET e POST metodi. Entrambi i metodi sono integrati con l'http://petstore-demo-endpoint.execute-api.com/petstore/petsHTTPendpoint. Configurare due tipi di convalida delle richieste:

  • Nel GET metodo, configurerai la convalida della richiesta per i parametri della stringa di URL query.

  • Nel metodo POST, verrà configurata la convalida delle richieste per il corpo della richiesta.

Ciò consentirà solo a determinate API chiamate di passare a. API

Scarica e decomprimi il modello di creazione dell'app per AWS CloudFormation. Utilizzerai questo modello per crearne uno incompletoAPI. Completerai il resto dei passaggi nella console API Gateway.

Per creare uno AWS CloudFormation stack
  1. Apri la AWS CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation.

  2. Scegliere Create stack (Crea stack), quindi With new resources (standard) (Con nuove risorse (standard)).

  3. In Specificare modello, scegliere Carica un file modello.

  4. Selezionare il modello scaricato.

  5. Seleziona Successivo.

  6. Per Stack name (Nome stack), inserire request-validation-tutorial-console, quindi scegliere Next (Avanti).

  7. Per Configure stack options (Configura opzioni di stack), scegliere Next (Successivo).

  8. Per quanto riguarda le funzionalità, riconosci che AWS CloudFormation puoi creare IAM risorse nel tuo account.

  9. Scegli Invia.

AWS CloudFormation fornisce le risorse specificate nel modello. Per completare il provisioning delle risorse, potrebbero essere necessari alcuni minuti. Quando lo stato del tuo AWS CloudFormation stack è CREATE_ COMPLETE, sei pronto per passare alla fase successiva.

Per selezionare il tuo appena creato API
  1. Selezionare lo stack request-validation-tutorial-console appena creato.

  2. Scegliere Resources (Risorse).

  3. In Physical ID, scegli il tuoAPI. Questo collegamento ti indirizzerà alla console API Gateway.

Prima di modificare i metodi GETPOST, è necessario creare un modello.

Creazione di un modello
  1. È necessario che un modello utilizzi la convalida della richiesta nel corpo di una richiesta in arrivo. Per creare un modello seleziona Modelli nel pannello di navigazione principale.

  2. Scegli Crea modello.

  3. Per Nome, immetti PetStoreModel.

  4. In Tipo di contenuto, inserire application/json. Se non viene trovato alcun tipo di contenuto corrispondente, la convalida della richiesta non viene eseguita. Per utilizzare lo stesso modello indipendentemente dal tipo di contenuti, inserisci $default.

  5. Per Descrizione immetti My PetStore Model come descrizione del modello.

  6. Per Schema modello incolla il seguente modello nell'editor di codice e scegli Crea.

    { "type" : "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "type" : "number", "minimum" : 25.0, "maximum" : 500.0 } } }

Per ulteriori informazioni sul modello, consulta Modelli di dati per REST APIs.

Per configurare la convalida della richiesta per un metodo GET
  1. Nel riquadro di navigazione principale, scegli Risorse, quindi seleziona il GETmetodo.

  2. Nella scheda Richiesta metodo, in Impostazioni richiesta metodo, scegli Modifica.

  3. Per Validatore richiesta seleziona Convalida parametri di stringa query e intestazioni.

  4. In Parametri della stringa di URL query, procedi come segue:

    1. Scegliere Add query string (Aggiungi stringa di query).

    2. Per Nome, immetti petType.

    3. Attiva Campo obbligatorio.

    4. Mantieni disattivata l'opzione Caching.

  5. Selezionare Salva.

  6. Nella scheda Richiesta di integrazione scegli Modifica in Impostazioni della richiesta di integrazione.

  7. In Parametri della stringa di URL query, procedi come segue:

    1. Scegliere Add query string (Aggiungi stringa di query).

    2. Per Nome, immetti petType.

    3. In Mappato da, inserire method.request.querystring.petType. Questa operazione associa petType al tipo di animale domestico.

      Per ulteriori informazioni sulla mappatura dei dati, consultare il tutorial relativo alla mappatura dei dati.

    4. Mantieni disattivata l'opzione Caching.

  8. Selezionare Salva.

Per eseguire il test della convalida della richiesta per il metodo GET
  1. Seleziona la scheda Test. Potrebbe essere necessario scegliere il pulsante freccia destra per visualizzare la scheda.

  2. In Stringhe di query immetti petType=dog e scegli Test.

  3. Il test del metodo restituirà 200 OK e un elenco di cani.

    Per informazioni su come trasformare questi dati di output, consultare il tutorial sulla mappatura dei dati.

  4. Rimuovere petType=dog e scegliere Test.

  5. Il test del metodo restituirà un errore 400 con il seguente messaggio di errore:

    { "message": "Missing required request parameters: [petType]" }
Per configurare la convalida della richiesta per il metodo POST
  1. Nel riquadro di navigazione principale, scegliete Risorse, quindi selezionate il POSTmetodo.

  2. Nella scheda Richiesta metodo, in Impostazioni richiesta metodo, scegli Modifica.

  3. Per Validatore richiesta seleziona Convalida corpo.

  4. In Corpo della richiesta scegli Aggiungi modello.

  5. Per Tipo di contenutoapplication/json, immettete, quindi per Modello, selezionate PetStoreModel.

  6. Selezionare Salva.

Per eseguire il test della convalida della richiesta per un metodo POST
  1. Seleziona la scheda Test. Potrebbe essere necessario scegliere il pulsante freccia destra per visualizzare la scheda.

  2. In Corpo della richiesta incolla quanto segue nell'editor di codice:

    { "id": 2, "name": "Bella", "type": "dog", "price": 400 }

    Scegli Test (Esegui test).

  3. Il test del metodo restituirà 200 OK e un messaggio di operazione riuscita.

  4. In Corpo della richiesta incolla quanto segue nell'editor di codice:

    { "id": 2, "name": "Bella", "type": "dog", "price": 4000 }

    Scegli Test (Esegui test).

  5. Il test del metodo restituirà un errore 400 con il seguente messaggio di errore:

    { "message": "Invalid request body" }

    Nella parte inferiore dei log del test viene restituito il motivo del corpo della richiesta non valido. In questo caso, il prezzo dell'animale era maggiore del valore massimo specificato nel modello.

Per eliminare una AWS CloudFormation pila
  1. Apri la AWS CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation.

  2. Seleziona il tuo AWS CloudFormation stack.

  3. Scegli Elimina e conferma la tua scelta.

Passaggi successivi

Imposta la convalida delle richieste di base utilizzando il AWS CLI

È possibile creare un validatore per configurare la convalida della richiesta utilizzando la  AWS CLI. Per seguire questo tutorial, utilizzerai un AWS CloudFormation modello per creare un API Gateway API incompleto.

Nota

Questo non è lo stesso AWS CloudFormation modello del tutorial per console.

Utilizzando una risorsa /validator precedentemente esposta, verranno creati i metodi GETPOST. Entrambi i metodi verranno integrati con l'http://petstore-demo-endpoint.execute-api.com/petstore/petsHTTPendpoint. Verranno configurate le due convalide delle richieste seguenti:

  • Sul GET metodo, creerai un params-only validatore per convalidare i parametri della stringa di URL query.

  • Nel metodo POST, verrà creato un validatore body-only per convalidare il corpo della richiesta.

Ciò consentirà solo a determinate API chiamate di passare a. API

Per creare una AWS CloudFormation pila

Scarica e decomprimi il modello di creazione dell'app per. AWS CloudFormation

Per completare il tutorial seguente, è necessario disporre della AWS Command Line Interface (AWS CLI) versione 2.

Per i comandi lunghi viene utilizzato un carattere di escape (\) per dividere un comando su più righe.

Nota

In Windows, alcuni CLI comandi Bash che usi comunemente (comezip) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, installa il sottosistema Windows per Linux. CLII comandi di esempio in questa guida utilizzano la formattazione Linux. I comandi che includono JSON documenti in linea devono essere riformattati se si utilizza Windows. CLI

  1. Usa il seguente comando per creare lo stack. AWS CloudFormation

    aws cloudformation create-stack --stack-name request-validation-tutorial-cli --template-body file://request-validation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM
  2. AWS CloudFormation fornisce le risorse specificate nel modello. Per completare il provisioning delle risorse, potrebbero essere necessari alcuni minuti. Usa il comando seguente per vedere lo stato del tuo AWS CloudFormation stack.

    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli
  3. Quando lo stato dello AWS CloudFormation stack èStackStatus: "CREATE_COMPLETE", usa il seguente comando per recuperare i valori di output pertinenti per i passaggi futuri.

    aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"

    Di seguito sono riportati i valori di output:

    • ApiId, che è l'ID per. API Per questo tutorial, l'APIID èabc123.

    • ResourceId, che è l'ID della risorsa di validazione in cui sono esposti POST i metodi GET and. Per questo tutorial, l'ID risorsa è efg456.

Creazione dei validatori della richiesta e importazione di un modello
  1. Per utilizzare la convalida della richiesta con la  AWS CLI, è necessario un validatore. Usare il seguente comando per creare un validatore che convalidi solo i parametri della richiesta.

    aws apigateway create-request-validator --rest-api-id abc123 \ --no-validate-request-body \ --validate-request-parameters \ --name params-only

    Annotare l'ID del validatore params-only.

  2. Usare il seguente comando per creare un validatore che convalidi solo il corpo della richiesta.

    aws apigateway create-request-validator --rest-api-id abc123 \ --validate-request-body \ --no-validate-request-parameters \ --name body-only

    Annotare l'ID del validatore body-only.

  3. È necessario che un modello utilizzi la convalida della richiesta nel corpo di una richiesta in arrivo. Utilizzare il comando seguente per importare un modello.

    aws apigateway create-model --rest-api-id abc123 --name PetStoreModel --description 'My PetStore Model' --content-type 'application/json' --schema '{"type": "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : {"type" : "integer"},"type" : {"type" : "string", "enum" : [ "dog", "cat", "fish" ]},"name" : { "type" : "string"},"price" : {"type" : "number","minimum" : 25.0, "maximum" : 500.0}}}}'

    Se non viene trovato alcun tipo di contenuto corrispondente, la convalida della richiesta non viene eseguita. Per utilizzare lo stesso modello indipendentemente dal tipo di contenuto, specifica $default come chiave.

Creazione dei metodi GETPOST
  1. Utilizzate il comando seguente per aggiungere il GET HTTP metodo alla /validate risorsa. Questo comando crea il metodo GET, aggiunge il validatore params-only e imposta la stringa di query petType come richiesto.

    aws apigateway put-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --authorization-type "NONE" \ --request-validator-id aaa111 \ --request-parameters "method.request.querystring.petType=true"

    Utilizzate il comando seguente per aggiungere il POST HTTP metodo alla /validate risorsa. Questo comando crea il metodo POST, aggiunge il validatore body-only e collega il modello al validatore solo del corpo.

    aws apigateway put-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --authorization-type "NONE" \ --request-validator-id bbb222 \ --request-models 'application/json'=PetStoreModel
  2. Utilizzare il comando seguente per configurare la risposta 200 OK del metodo GET /validate.

    aws apigateway put-method-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --status-code 200

    Utilizzare il comando seguente per configurare la risposta 200 OK del metodo POST /validate.

    aws apigateway put-method-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --status-code 200
  3. Utilizzate il comando seguente per configurare un dispositivo Integration con un HTTP endpoint specificato per il GET /validation metodo.

    aws apigateway put-integration --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --type HTTP \ --integration-http-method GET \ --request-parameters '{"integration.request.querystring.type" : "method.request.querystring.petType"}' \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'

    Utilizzate il comando seguente per impostare un endpoint Integration con un HTTP endpoint specificato per il POST /validation metodo.

    aws apigateway put-integration --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --type HTTP \ --integration-http-method GET \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
  4. Utilizzare il comando seguente per configurare una risposta di integrazione per il metodo GET /validation.

    aws apigateway put-integration-response --rest-api-id abc123 \ --resource-id efg456\ --http-method GET \ --status-code 200 \ --selection-pattern ""

    Utilizzare il comando seguente per configurare una risposta di integrazione per il metodo POST /validation.

    aws apigateway put-integration-response --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --status-code 200 \ --selection-pattern ""
Per testare il API
  1. Per testare il metodo GET, che eseguirà la convalida della richiesta per le stringhe di query, usare il seguente comando:

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET \ --path-with-query-string '/validate?petType=dog'

    Il risultato restituirà 200 OK e l'elenco dei cani.

  2. Utilizzare il seguente comando per eseguire il test senza includere la stringa di query petType.

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method GET

    Il risultato restituirà un errore 400.

  3. Per testare il metodo POST, che eseguirà la convalida della richiesta per il corpo della richiesta, usare il seguente comando:

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'

    Il risultato restituirà 200 OK e un messaggio di operazione riuscita.

  4. Usare il seguente comando per testare l'utilizzo di un corpo non valido.

    aws apigateway test-invoke-method --rest-api-id abc123 \ --resource-id efg456 \ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 1000 }'

    Il risultato restituirà un errore 400, perché il prezzo del cane supera il prezzo massimo definito dal modello.

Per eliminare una AWS CloudFormation pila
  • Usa il seguente comando per eliminare le tue AWS CloudFormation risorse.

    aws cloudformation delete-stack --stack-name request-validation-tutorial-cli

Imposta la convalida delle richieste di base utilizzando una definizione aperta API

È possibile dichiarare un validatore di richiesta a API livello specificando un insieme di x-amazon-apigateway-request-validatori. requestValidator oggetto oggetti nella x-amazon-apigateway-requestoggetto -validators mappa per selezionare quale parte della richiesta verrà convalidata. Nell'esempio Open API definition, ci sono due validatori:

  • Il validatore all, che convalida sia il corpo, mediante il modello di dati RequestBodyModel, sia i parametri.

    Il modello di RequestBodyModel dati richiede che l'JSONoggetto di input contenga le price proprietà nametype, e. La proprietà name può essere qualsiasi stringa, type deve essere uno dei campi dell'enumerazione specificati (["dog", "cat", "fish"]) e price deve essere compreso tra 25 e 500. Il parametro id non è obbligatorio.

  • Il validatore param-only, che convalida solo i parametri.

Per attivare un validatore di richiesta su tutti i metodi di anAPI, specificate una x-amazon-apigateway-requestproprietà -validator proprietà a API livello della API definizione Open. Nell'esempio Open API definition, il all validatore viene utilizzato su tutti i API metodi, a meno che non venga sovrascritto diversamente. Quando si utilizza un modello per convalidare il corpo, se non viene trovato alcun tipo di contenuto corrispondente, la convalida della richiesta non viene eseguita. Per utilizzare lo stesso modello indipendentemente dal tipo di contenuto, specifica $default come chiave.

Per attivare un validatore di richieste in un singolo metodo, specificare la proprietà x-amazon-apigateway-request-validator a livello di metodo. Nell'esempio, Open API definition, il param-only validatore sovrascrive il validatore sul all metodo. GET

Per importare l'APIesempio Open in API Gateway, consultate le seguenti istruzioni su o versoImportazione di un'API regionale in API Gateway. Importazione di un'API ottimizzata per l'edge in API Gateway

OpenAPI 3.0
{ "openapi" : "3.0.1", "info" : { "title" : "ReqValidators Sample", "version" : "1.0.0" }, "servers" : [ { "url" : "/{basePath}", "variables" : { "basePath" : { "default" : "/v1" } } } ], "paths" : { "/validation" : { "get" : { "parameters" : [ { "name" : "q1", "in" : "query", "required" : true, "schema" : { "type" : "string" } } ], "responses" : { "200" : { "description" : "200 response", "headers" : { "test-method-response-header" : { "schema" : { "type" : "string" } } }, "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/ArrayOfError" } } } } }, "x-amazon-apigateway-request-validator" : "params-only", "x-amazon-apigateway-integration" : { "httpMethod" : "GET", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.querystring.type" : "method.request.querystring.q1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } }, "post" : { "parameters" : [ { "name" : "h1", "in" : "header", "required" : true, "schema" : { "type" : "string" } } ], "requestBody" : { "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/RequestBodyModel" } } }, "required" : true }, "responses" : { "200" : { "description" : "200 response", "headers" : { "test-method-response-header" : { "schema" : { "type" : "string" } } }, "content" : { "application/json" : { "schema" : { "$ref" : "#/components/schemas/ArrayOfError" } } } } }, "x-amazon-apigateway-request-validator" : "all", "x-amazon-apigateway-integration" : { "httpMethod" : "POST", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.header.custom_h1" : "method.request.header.h1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } } } }, "components" : { "schemas" : { "RequestBodyModel" : { "required" : [ "name", "price", "type" ], "type" : "object", "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "maximum" : 500.0, "minimum" : 25.0, "type" : "number" } } }, "ArrayOfError" : { "type" : "array", "items" : { "$ref" : "#/components/schemas/Error" } }, "Error" : { "type" : "object" } } }, "x-amazon-apigateway-request-validators" : { "all" : { "validateRequestParameters" : true, "validateRequestBody" : true }, "params-only" : { "validateRequestParameters" : true, "validateRequestBody" : false } } }
OpenAPI 2.0
{ "swagger" : "2.0", "info" : { "version" : "1.0.0", "title" : "ReqValidators Sample" }, "basePath" : "/v1", "schemes" : [ "https" ], "paths" : { "/validation" : { "get" : { "produces" : [ "application/json", "application/xml" ], "parameters" : [ { "name" : "q1", "in" : "query", "required" : true, "type" : "string" } ], "responses" : { "200" : { "description" : "200 response", "schema" : { "$ref" : "#/definitions/ArrayOfError" }, "headers" : { "test-method-response-header" : { "type" : "string" } } } }, "x-amazon-apigateway-request-validator" : "params-only", "x-amazon-apigateway-integration" : { "httpMethod" : "GET", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.querystring.type" : "method.request.querystring.q1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } }, "post" : { "consumes" : [ "application/json" ], "produces" : [ "application/json", "application/xml" ], "parameters" : [ { "name" : "h1", "in" : "header", "required" : true, "type" : "string" }, { "in" : "body", "name" : "RequestBodyModel", "required" : true, "schema" : { "$ref" : "#/definitions/RequestBodyModel" } } ], "responses" : { "200" : { "description" : "200 response", "schema" : { "$ref" : "#/definitions/ArrayOfError" }, "headers" : { "test-method-response-header" : { "type" : "string" } } } }, "x-amazon-apigateway-request-validator" : "all", "x-amazon-apigateway-integration" : { "httpMethod" : "POST", "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets", "responses" : { "default" : { "statusCode" : "400", "responseParameters" : { "method.response.header.test-method-response-header" : "'static value'" }, "responseTemplates" : { "application/xml" : "xml 400 response template", "application/json" : "json 400 response template" } }, "2\\d{2}" : { "statusCode" : "200" } }, "requestParameters" : { "integration.request.header.custom_h1" : "method.request.header.h1" }, "passthroughBehavior" : "when_no_match", "type" : "http" } } } }, "definitions" : { "RequestBodyModel" : { "type" : "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "type" : "number", "minimum" : 25.0, "maximum" : 500.0 } } }, "ArrayOfError" : { "type" : "array", "items" : { "$ref" : "#/definitions/Error" } }, "Error" : { "type" : "object" } }, "x-amazon-apigateway-request-validators" : { "all" : { "validateRequestParameters" : true, "validateRequestBody" : true }, "params-only" : { "validateRequestParameters" : true, "validateRequestBody" : false } } }