Come faccio a mappare i codici di stato della risposta per le integrazioni di API Gateway nelle API REST?

Ultimo aggiornamento: 30/09/2022

Perché AWS Lambda restituisce 200 risposte al codice di stato OK nelle API REST?

Come faccio a mappare i codici di stato restituiti dalle API REST in Amazon API Gateway?

oppure

Come faccio a mappare i codici di stato nelle API REST?

Risoluzione

Se desideri sovrascrivere i codici di stato della risposta del backend, usa i modelli di mappatura di API Gateway o le espressioni regolari per mappare i codici di stato. Puoi farlo nelle integrazioni proxy e non proxy con l'API REST.

Le integrazioni proxy e non proxy vengono utilizzate per mappare i codici di stato della risposta nell'API REST. Quando c'è una risposta proxy, API Gateway riceve i codici di stato man mano che vengono inviati dal backend. In un'integrazione proxy Lambda, API Gateway richiede la funzione Lambda di backend per restituire il seguente output in formato JSON:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode, 
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": “…”65411
}

In un'integrazione proxy con una funzione Lambda, un codice di stato viene passato direttamente ad API Gateway da una funzione Lambda di backend. Un codice di stato non può essere passato direttamente dalla funzione Lambda in un'integrazione non proxy.

Quando API Gateway richiama correttamente una funzione Lambda, il codice di stato della risposta predefinito è 200. I codici di stato vengono restituiti anche quando Lambda presenta errori. Puoi personalizzare i codici di risposta di API Gateway. Utilizza un'integrazione non proxy e un modello di mappatura quando devi creare un codice di risposta personalizzato.

Configurazione di un metodo di risposta con codice personalizzato

Segui questi passaggi per configurare un metodo per rispondere con un codice di risposta personalizzato da API Gateway:

1.    Nella console di API Gateway, crea un'API REST pubblica.

2.    Crea una risorsa e un metodo per la risorsa.

3.    Configura una risposta di metodo che includa il codice di stato che desideri venga restituito da API Gateway.

4.    Configura una risposta di integrazione Lambda.

  • Per Lambda Error Regex, fornisci il modello di espressione regolare per il messaggio di errore restituito dalla funzione Lambda.
    Nota: puoi anche trovare l' HTTP error regex per le risposte HTTP.
  • Per lo stato della risposta del metodo, fornisci il codice di stato che deve essere restituito da API Gateway.
  • Scegli un'opzione per la Gestione dei contenuti per impostare il modo in cui viene gestito il corpo della risposta prima che questa venga inviata al client.
  • Assicurati che lo schema predefinito del codice di stato sia impostato su 200.

5.    Dopo aver completato la configurazione della risposta all'integrazione, salva, testa e distribuisci le modifiche.

Mappatura dei codici di stato su valori statici

Affinché API Gateway acquisisca un gruppo di codici di stato restituiti dal backend, mappa i codici di stato su valori statici:

1.    Vai alla risorsa con il codice di stato che desideri modificare.

2.    Imposta una risposta di metodo per restituire 400 come codice di risposta di API Gateway.

3.    Torna alle configurazioni delle risorse e imposta una risposta di integrazione.

4.    I valori in HTTP status regex acquisiscono lo stato restituito dal backend. Lo stato viene quindi mappato al codice di risposta definito nella Fase 2.

Quando la regex dello stato HTTP ha un valore predefinito di “-” ed è mappata a200 come stato di risposta del metodo, tutti i codici di stato vengono acquisiti e restituiti dalla mappa di backend a 200. Puoi modificare i valori HTTP status regex in 2\d{2} per acquisire tutte le risposte 2xx e mapparle a 200.

5.    Scegli Aggiungi risposta di integrazione per acquisire gli altri codici di stato.

Per 4xx, in HTTP status regex, aggiungi 4\d{2}. Per lo stato della risposta di metodo, scegli 400. Questo è stato definito nella Fase 2.

6.    Distribuisci l'API. Quando l'API restituisce qualsiasi codice di stato 2xx, questi vengono mappati al codice di stato 200. Se la tua API restituisce dei codici di stato 4xx, questi vengono mappati al codice di stato 400.

Le espressioni regolari possono essere formattate in diversi modi. Ad esempio:

  • .*([01][0-9][0-9]|2[0-4][0-9]|25[0-5]).* corrisponde a codici di stato compresi tra 100-199, 200-249 o 250-255.
  • .*5\d\d.* corrisponde a un codice di stato, ad esempio 5xx.

Il seguente codice di esempio serve per testare una funzione Lambda:

def lambda_handler(event, context):
    if "error" not in event or event['error'] == "":
        return("Pass")
    elif event['error'] == 'sample 400':
        raise Exception({"errorMessage": "Error: Raising 400 from within the Lambda function","errorType": "Exception"})
    elif event['error'] == 'sample 500':
        raise Exception({"errorMessage": "Error: Raising 500 from within the Lambda function","errorType": "Exception"})
    else:
        return("Error Value in the json request should either be 400 or 500 to demonstrate")

Nell'esempio, il codice verifica se il valore di errore inviato da API Gateway è un errore 400 o 500. Quando si tratta di un errore 400 o 500, il codice Lambda genera un'eccezione con un messaggio di errore. Quando API Gateway riceve la risposta, il servizio verifica se il messaggio di errore corrisponde a uno modello configurato nella risposta di integrazione. API Gateway risponde di conseguenza se il pattern regex Lambda corrisponde.

7.    Dopo una configurazione riuscita, i codici di stato possono essere testati utilizzando la console API Gateway.

Mappatura dei codici di stato con modelli relativi

L'esempio precedente utilizza espressioni regolari, ma può anche utilizzare modelli di mappatura. L'esempio seguente sostituisce il codice di stato 200 del backend per applicare il codice di stato 400:

1.    Crea una funzione Lambda con il seguente codice di esempio:

----------------------
def lambda_handler(event, context):
    # TODO implement print(event)
    return { 'statusCode': 200, 'body': "customerror" }
-----------------------

2.    Crea un'API con integrazione non proxy Lambda utilizzando la precedente funzione Lambda per il backend.

3.    Segui i passaggi 6-10 descritti nel tutorial Sostituisci il codice di stato della risposta di un'API con la console API Gateway.

In questo esempio, utilizza il seguente modello di mappatura:

----------------------
#set($inputRoot = $input.path('$'))
$input.json("$")
#if($inputRoot.toString().contains("customerror"))
#set($context.responseOverride.status = 400)
#end 
----------------------

4.    Salva, testa e distribuisci l'API.