web-dev-qa-db-ja.com

リクエスト本文をJSONに解析できませんでした:予期しない文字(\ '-\'(コード45))AWS Lambda + API + Postman

AWSのAPI GatewayからLambda関数に送信されるパラメーターを取得しようと数日試みましたが、成功していません。

私は最初から始めることに決めたので、彼らのウォークスルーに従いました( http://docs.aws.Amazon.com/apigateway/latest/developerguide/getting-started.html#getting-started-new-lambda =)

私はこのチュートリアルを2回確認し、手紙の手順に従いました。

問題

PostmanからまたはSwift=でAPIをテストすると、エラーが発生します。

{"メッセージ": "要求本文をjsonに解析できませんでした:数値の予期しない文字(\ '-\'(コード45)):有効な数値の場合は、マイナス記号の後に数字(0-9)が必要です\ n [出典:[B @ c036d15;行:1、列:3] "}

郵便配達員で、結果をJSONとして表示すると、

悪い文字列

ラムダ関数

この関数は、チュートリアルの基本的な例です。

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
};

Lambda Consoleからテストデータをテストすると、結果が得られます。

{
    "Hello": "TestUser123"
}

API Gatewayテストからテストすると、結果も次のようになります。

 {
    "Hello": "TestUser123"
}

両方のテストコンソールがこの動作を許可している理由を誰でも見ることができますが、POSTMANでテストした場合、またはSwiftスクリプト内で使用した場合、動作しませんか?

編集1

郵便配達員では、content-typeをapplication/jsonに設定しました

スクリプトはデフォルトを返します:

 {
    "Hello": "user"
}

ただし、POSTMANでパラメーターnameおよびTestUser123を追加すると、これがエラーを返すときです。

アップデート1

それでは、マッピングテンプレートを別の回答で見つけたものに変更しました。

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

結果は次のとおりです。

{
   "Hello": ""
}

なぜ名前を得ていないのですか?

13
JamesG

私は今日これで立ち往生しました。

マッピングテンプレートは次のとおりです。

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

AWSはAWS Velocityテンプレートを使用します。 JSONのように見えても、異なります。

使用する場合

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

統合要求ステップでのマッピングテンプレートの場合、期待どおりに動作するはずです。

6

エラーメッセージを非常に注意深く読んでください。実際に問題がわかります。たとえば、私は

リクエスト本文をjsonに解析できませんでした:予期しない文字(\ '\ "\'(コード34)):was expectカンマを区切るオブジェクトエントリ

問題は、コンマが欠落していることです。 LambdaのIntegration Request-Body Mapping Template:を確認します

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

問題を見つけることができますか?収入行の後にコンマがありません。


別の例を示します。

要求本文をJSONに解析できませんでした:予期しない文字(\ '} \'(コード125)):値が必要です

Integration Request-Body Mapping Templateを見ると:

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

問題を見つけることができますか? $ inputRootincomeにドットがありません。

2
Jeremy Thompson