20

この投稿と同じことを達成しようとしていますが、そこでの返信を理解できず、コメントで説明を求める許可がありません。

GET リクエストを受け入れ、いくつかのリクエスト変数を Lambda 関数 (Python で実装) に渡し、空の応答モデルを介して text/html を返す API Gateway エンドポイントがあります (ここで説明されているように)

前の SO の質問で説明したように、Lambda 関数が HTML 文字列を返し、API エンドポイントがデフォルトの Output Passthrough 動作 @ Integration Response を使用する場合、HTML 出力は引用されます。

"\n<html>\n<body>\n ... \n</body>\n</html>\n"

その答え (@ARUNBALAN NV による) は、「HTML マークアップを変数に保存して返すだけです。」と言っていますが、Lambda 関数のコンテキストでそれが何を意味するのかわかりません。「variableHTML」という名前の要素を含む「application/json」レスポンスを返すということですか? このようなもの?

"{\"variableHTML\": \"\\n<html>\\n<body>\\n ... \\n</body>\\n</html>\\n\"}"

私はそれを設定し、API Gateway で統合応答がマッピングを使用して要素を抽出するようになりました (200 アプリケーション/json 応答の場合) 提案どおりに正確に:

#set($inputRoot = $input.path('$')) 
$inputRoot.variableHTML .

結果は単一のドットとして返されます。

私は多くのバリエーション ($input.path の代わりに $input.json、さまざまな段階でのさまざまなコンテンツ タイプなど) を試しましたが、上記の設定が他のスレッドから受け入れられた回答に最も近いと感じています。

これで私が間違っているという洞察は高く評価されます。読んでくれてありがとう!

4

3 に答える 3

42

あなたはとても近くにいます。これを理解するための鍵は、返される Python オブジェクトが JSON にシリアライズされることを理解することです。そのため、文字列を返す場合、それは引用符で囲まれ、有効な JSON オブジェクトにエスケープされます。この文字列の値が必要な場合は、次の統合レスポンス マッピングを使用します。

#set($inputRoot = $input.path('$')) 
$inputRoot

この#set行は$inputRoot、Python プログラムが返した JSON オブジェクト全体の値を示しています...これは、Lambda フレームワークが JSON に変換する前に返された元の文字列です。

プログラムではなく、マッピングで応答を作成したいとします。次に、Python 文字列を返す代わりに、次のように Python オブジェクトを返すことができます。

return {"title": "Greeting", "message": "Hello"}

マッピングは、次のように HTML に変換できます。

#set($inputRoot = $input.path('$')) 
<html><head><title>$inputRoot.title</title></head>
<body>$inputRoot.message</body></html>

ただし、単純な HTML よりも構造化データを返す場合は、そのようにマッピングを使用する方が便利です。あなたの問題には上記の最初のマッピングを使用します。

于 2015-11-09T17:38:24.290 に答える