web-dev-qa-db-fra.com

Impossible d'analyser le corps de la demande dans json: caractère inattendu (\ '- \' (code 45)) AWS Lambda + API + Postman

J'essaie depuis quelques jours d'obtenir un paramètre envoyé de la passerelle API dans AWS à une fonction Lambda et je n'ai aucun succès.

J'ai décidé de commencer depuis le début, j'ai donc suivi leur procédure pas à pas ( http://docs.aws.Amazon.com/apigateway/latest/developerguide/getting-started.html#getting-started-new-lambda =)

J'ai vérifié cette procédure deux fois et j'ai suivi les étapes à la lettre.

Problème

Lorsque je teste l'API à partir de Postman ou dans Swift je reçois l'erreur:

{"message": "Impossible d'analyser le corps de la demande dans json: caractère inattendu (\ '- \' (code 45)) dans la valeur numérique: chiffre attendu (0-9) pour suivre le signe moins, pour une valeur numérique valide\n à [Source: [B @ c036d15; ligne: 1, colonne: 3] "}

Dans le facteur, quand je vois le résultat en JSON, je reçois juste

Mauvaise chaîne

Fonction Lambda

La fonction est l'exemple de base de la procédure pas à pas:

console.log('Loading event');

exports.handler = function(event, context) {
  var name = (event.name === undefined ? 'No-Name' : event.name);
  console.log('"Hello":"' + name + '"');
  context.done(null, {"Hello":name}); // SUCCESS with message
};

Lorsque testé à partir de la console Lambda et avec les données de test, j'obtiens le résultat:

{
    "Hello": "TestUser123"
}

Lorsque testé à partir du test API Gateway, le résultat est également:

 {
    "Hello": "TestUser123"
}

Quelqu'un peut-il voir pourquoi les deux consoles de test autorisent ce travail, mais lorsqu'elles sont testées avec POSTMAN ou utilisées dans un script Swift cela ne fonctionne pas?

Modifier 1

Dans Postman, j'ai défini le type de contenu sur application/json

Le script renvoie la valeur par défaut:

 {
    "Hello": "user"
}

Cependant, lorsque j'ajoute les paramètres nom et TestUser123 dans POSTMAN, c'est quand il renvoie l'erreur.

Mise à jour 1

Ok, j'ai donc changé le modèle de mappage en un que j'ai trouvé sur une autre réponse:

{ "name": "$input.params('name')" }

Maintenant, le résultat est:

{
   "Hello": ""
}

Des idées pourquoi il ne reçoit pas le nom?

16
JamesG

Je suis juste coincé avec ça aujourd'hui.

votre modèle de cartographie est:

{ "name": "$input.params('name')" }

AWS utilise des modèles AWS Velocity, qui; même si ressemble à JSON, est différent.

si tu utilises

{ "name": $input.params('name') } // notice no quotes

pour le modèle de mappage directement à l'étape de la demande d'intégration, alors il devrait fonctionner comme prévu.

6
Amresh Venugopal

Lisez le message d'erreur très attentivement, il vous indique en fait le problème. Par exemple, j'ai

Impossible d'analyser le corps de la demande dans json: caractère inattendu (\ '\ "\' (code 34)): était s'attendant à ce que la virgule se sépare entrées d'objet

Donc, le problème est que je manque une virgule. Je vérifie mon Lambda demande d'intégration - modèle de cartographie du corps:

{
"age" : $input.json('$.persondata.age'),
"income" : $input.json('$.persondata.income')
"height" : $input.json('$.persondata.height')
}

Pouvez-vous repérer le problème? Je manque une virgule après la ligne de revenu.


Voici un autre exemple.

Impossible d'analyser le corps de la demande dans json: caractère inattendu (\ '} \' (code 125)): valeur attendue

Quand je regarde le demande d'intégration - modèle de cartographie du corps:

#set($inputRoot = $input.path('$'))
{
  "age" : $inputRoot.age,
  "height" : $inputRoot.height,
  "income" : $inputRootincome
}

Pouvez-vous repérer le problème? Il me manque un point dans $ inputRootincome.

2
Jeremy Thompson