web-dev-qa-db-ja.com

AWS API GatewayからHTMLを返す

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

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

以前のSO質問で説明したように、Lambda関数がHTML文字列を返し、APIエンドポイントがデフォルトの出力パススルー動作@統合応答を使用する場合、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、さまざまな段階でのさまざまなコンテンツタイプなど)を試しましたが、上記の設定は他のスレッドから受け入れられた回答に最もよく一致していると感じています。

私がこれで間違っているところはどんな洞察でも感謝されます。読んでくれてありがとう!

20
Kenneth D.

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

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

#set行は$inputRoot JSONオブジェクト全体の値your Pythonプログラムが返しました...これは、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よりも構造化データを返す場合に役立ちます。上記の最初のマッピングを問題に使用します。

39
Charles Engelke

Expressを使用する場合、次のようにアプリでヘッダーを設定するだけです。

res.set('Content-Type', 'text/html');

aws-serverless-expressまたは同様のものを使用する場合、それらのヘッダーを伝播する必要があります。

3
Olivier Pichon