前回はほぼLambdaだけでREST APIを作成してみました。 その応用でCSVファイルのダウンロードとクロスサイトスクリプトの対応例を紹介します。
前回のLambdaを使いまわしますので、先にそちらを参照してください。
CSVファイルをダウンロード
exports.handler = async (event) => { return { "statusCode": 200, "headers": { "Content-Disposition": 'attachment;filename="aaa.csv"', "Content-Type": 'text/csv' }, "body": 'Hello,from,Lambda!' }; };
"headers"でファイル名やファイルの形式を指定します。 "filename"の部分を変更すればファイル名を動的に変更することができます。 API Gatewayでヘッダーを作成するとファイル名を動的に変更できないため、Lambdaで指定するやり方ならではだと言えます。
前回作成したURLを開けばダウンロードが始まります。
クロスサイトスクリプト(XSS/CORS)対応
exports.handler = async (event) => { return { "statusCode": 200, "headers": { "Content-Type": 'application/json', "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token", "Access-Control-Allow-Methods": "POST", "Access-Control-Allow-Origin": "*" }, "body": JSON.stringify({"key1":"val1", "key2":"val2"}) }; };
ヘッダーにCORS用の値を設定します。 AJAXでJSONを扱う場合なんかに大変有効ですね。
実際に動いている所を確認するには、下記サービスが便利なので利用させていただきました。 POSTメソッドのテスト https://so-zou.jp/web-app/network/post/
まとめ
非常によく使う2機能の作り方を紹介しました。 画像や動画、ZIPファイル等をレスポンスにする場合は、API Gatewayの操作も必要になってきてしまいます。 とはいえ、ほぼほぼLambda側だけでできるので、別の機会に紹介できればと思います。