Est-il un moyen de changer les codes d'état http retourné par Amazon API Gateway?
Par exemple, si je souhaite retourner un spécifique erreur 400 pour les paramètres non valides ou peut-être un 201 lorsque la fonction lambda appel a entraîné une de créer.
J'aimerais avoir différents codes d'état http, mais il ressemble à de la passerelle api renvoie toujours un code d'état 200 même si la fonction lambda est de retourner une erreur.
- donc il semble que le problème j'ai eu, j'étais de retour un message d'erreur personnalisé de type qui fait de la errorMessage regex ne fonctionne pas correctement. De retour d'une norme de chaîne de caractères dans l'échec de la réponse de lambda va faire ci-dessous la solution de travail - retour de votre propre objet d'erreur cependant, ne sera pas.
- ma solution a été de passer de Serveless version 0.5 à 1.0. Aussi, je suis en utilisant la réponse de Serveless de la documentation, en précisant le statusCode dans la réponse de l'objet en tant que propriété. J'espère que ça aide
Vous devez vous connecter pour publier un commentaire.
Mise à jour par 20-9-2016
Amazon enfin fait ce facile à l'aide de la Lambda Proxy intégration. Cela permet à votre fonction Lambda de retour bon HTTP codes et les en-têtes:
Dire au revoir requête/réponse de la cartographie dans la Passerelle API!
Option 2
Intégrer une Express app avec Lambda/Passerelle API à l'aide de aws-sans serveur-express.
callback
style. Il suffit de necallback(null, {statusCode: 200, body: 'whatever'})
.return { "isBase64Encoded": True, "statusCode": 200, "headers": { }, "body": "" }
Voici le moyen le plus rapide pour retourner sur les Codes d'État HTTP et une coutume
errorMessage
:Dans la Passerelle API tableau de bord, procédez de la manière suivante:
Ajouter un intégration réponse pour chacun des Codes d'État HTTP que vous avez créé plus tôt. Assurez-vous que entrée passthrough est cochée. Utilisation lambda erreur regex pour identifier le code d'état doit être utilisée lorsque vous retourne un message d'erreur à partir de votre fonction lambda. Par exemple:
Votre Passerelle API route devrait revenir ce:
Je ne vois aucun moyen de copier ces paramètres et de les ré-utiliser pour les différentes méthodes, nous avons donc beaucoup ennuyeux redondant introduction manuelle à faire!
Mon Intégration des Réponses ressembler à ceci:
return context.fail(new Error('bad one'))
200 OK
ou201 CREATED
.Pour être en mesure de retourner un message d'erreur personnalisé objet JSON, vous devez sauter à travers quelques cerceaux.
Tout d'abord, vous devez basculer le Lambda et lui passer un stringified objet JSON:
Ensuite, vous configurez l'expression régulière de la cartographie pour chacun des codes d'état que vous souhaitez retourner. À l'aide de l'objet que je définis ci-dessus, vous serait d'installation de cette regex pour 400:
.*"le statut":400.*
Enfin, vous l'installation d'un Modèle de Mappage pour extraire la réponse JSON à partir de la propriété errorMessage retourné par Lambda. Le Modèle de Mappage ressemble à ceci:
$d'entrée.path('$.errorMessage')
J'ai écrit un article sur ce qui va plus dans le détail et explique la réponse de l'écoulement à partir de Lambda à la Passerelle API ici:
http://kennbrodhagen.net/2016/03/09/how-to-return-a-custom-error-object-and-status-code-from-api-gateway-with-lambda/
1) Configurer votre Passerelle API ressource à utiliser Lambda Proxy Intégration en cochant la case "Utilisation Lambda Proxy intégration" sur "l'Intégration de la Demande" de l'écran de la Passerelle API définition de la ressource. (Ou de le définir dans votre cloudformation/terraform/sans serveur/etc config)
2) Changer votre lambda code de 2 façons
event
(1er argument de fonction) de manière appropriée. Il n'est plus juste le strict charge utile, elle représente l'ensemble de la requête HTTP, y compris les en-têtes, de chaîne de requête, et le corps. L'échantillon ci-dessous. Le point clé est que JSON corps seront chaînes nécessitant expliciteJSON.parse(event.body)
appeler (ne pas oubliertry/catch
autour de ça). Exemple ci-dessous.statusCode
,body
, etheaders
.body
devrait être une chaîne de caractères, donc, neJSON.stringify(payload)
que nécessairestatusCode
peut être un nombreheaders
est un objet de noms d'en-tête de valeursÉchantillon Lambda Événement Argument pour Proxy Intégration
Échantillon De Rappel De La Réponse De La Forme
Notes
- Je crois que les méthodes sur
context
commecontext.succeed()
sont obsolètes. Ils ne sont plus documentés, bien qu'ils ne semblent toujours fonctionner. Je pense que le codage de la fonction de rappel de l'API est la bonne chose à aller de l'avant.Pour ceux qui ont essayé de tout mettre sur cette question et ne pouvait pas faire ce travail (comme moi), cochez la thedevkit un commentaire sur ce post (sauvé ma journée):
https://forums.aws.amazon.com/thread.jspa?threadID=192918
Reproduire intégralement ci-dessous:
La façon la plus simple de le faire est de utilisation LAMBDA_PROXY intégration. En utilisant cette méthode, vous n'avez pas besoin de tout spécial transformations pour être mis en API Gateway pipeline.
Votre retour de l'objet devrait être similaire à l'extrait de code ci-dessous:
Il comporte quelques inconvénients: comme devant être particulièrement prudent sur la gestion des erreurs, et l'accouplement votre fonction lambda à la Passerelle API point de terminaison; cela dit, si vous n'étiez pas vraiment l'intention de l'utiliser n'importe où ailleurs, il n'est pas beaucoup d'un problème.
Je voulais une erreur de Lambda à être bon d'erreur 500,
après avoir fait beaucoup de recherche, est venu avec le ci-dessous, qui fonctionne:
LAMBDA
Pour une bonne réponse, je suis de retour en tant que ci-dessous:
Pour une mauvaise réponse, de retour en tant que ci-dessous
Sur la Passerelle API
Pour une MÉTHODE GET, dire OBTENIR de /res1/service1:
Puis,
Maintenant, publier /res1/service1, frapper l'URL publiée, qui est connecté à au-dessus de lambda
De pointe RESTE client (ou Facteur) chrome plugin, vous verrez bon http codes comme erreur de serveur (500), soit 400 au lieu de 200 code de réponse http pour toutes les demandes qui ont été donnés dans "httpStatusCode".
À partir du "tableau de bord" de l'API, d'API Gateway, nous pouvons voir les codes d'état http, comme ci-dessous:
C'est comment il est recommandé sur AWS Calculer Blog si à l'aide de la Passerelle API. Vérifier pour voir si l'intégration fonctionne avec direct Lambda invocation.
Direct Lambda invocations, cela semble être la meilleure solution d'analyse sur le côté client.
Je suis sans serveur à l'aide de 0.5. Voilà comment cela fonctionne, pour mon cas
s-fonction.json:
handler.js: