実現したいこと
クライアント側からREST形式のAPIにパラメータ(キーワード)をPOSTでリクエストボディとして渡し、APIでスクレイピングをした結果を受け取る機能を実装したいです。
発生している問題・エラーメッセージ
APIを実行してCloudWatch上からログを見ると、リクエストボディがうまく渡らず、空の状態で渡っているように見えます。
クライアント側で設定している値を渡したいのですが、うまくいかずに詰まっております。
恐らくGASの書き方、パラメータの詰め方に問題があるのではと考えておりますが、どこを改善すべきか教えていただけますと幸いです。
前提
クライアント(APIの呼び出し)側:Google Apps Script(以下、GAS)
API:AWS Lambda(Python3.10), API Gatewayでマッピングテンプレートを利用しています。
APIのログ
2023-05-24T02:05:54.272+09:00 context : 2023-05-24T02:05:54.272+09:00 LambdaContext([aws_request_id=XXXXXXXXXXXXX,log_group_name=XXXXX,log_stream_name=2023/05/23/[$LATEST]92bde2758f5f45e1893d3968f58c2c53,function_name=scrape-api,memory_limit_in_mb=128,function_version=$LATEST,invoked_function_arn=XXXXXXXXXX:function:XXXXXX,client_context=None,identity=CognitoIdentity([cognito_identity_id=None,cognito_identity_pool_id=None])]) 2023-05-24T02:05:54.272+09:00 event : 2023-05-24T02:05:54.272+09:00 {'keyword': '', 'userId': '', 'groupId': ''}
該当のソースコード
Javascript
1// GASで書いていますが、コードが見やすいので表記の言語はJSにしておきます。 2// 実行しているのはtest()です 3function test(){ 4 var word = 'test' 5 var userId = 'testUserId' 6 var groupId = 'testGroup' 7 callApi(word, userId, groupId) 8} 9 10function callApi(word, userId, groupId){ 11 var params = { 12 'keyword': word, 13 'userId': userId, 14 'groupId' : groupId 15 }; 16 17 var options = { 18 'method': 'POST', 19 'headers': { 20 'Content-Type': 'application/json' 21 }, 22 'payload': JSON.stringify(params), 23 muteHttpExceptions: true 24 }; 25 26 var url = 'https://XXXXXXXXXXXXXXXXXXXX.amazonaws.com/dev/'; 27 var result = UrlFetchApp.fetch(url, options); 28 Logger.log(result); 29}
Python
1import json 2import requests 3from bs4 import BeautifulSoup 4 5def lambda_handler(event, context): 6 print("context : ") 7 print(context) 8 print("event : ") 9 print(event) 10 11 word = event['keyword'] 12 13 ##その後の処理...
マッピングテンプレートの設定
- 統合タイプ : Lambda関数
- マッピングテンプレート : テンプレートが定義されていない場合(推奨)
- Content-Type : application/json
{ "keyword": "$input.path('$.keyword')", "userId": "$input.path('$.userId')", "groupId": "$input.path('$.groupId')" }
試したこと
- API Gatewayのテスト機能の中の「リクエスト本文」に以下を記載してテストをしたところ、問題なくLambda側に渡っていることは確認しました。
{'keyword': 'testtest', 'userId': 'tesutuser', 'groupId': 'testgroup'}
- マッピングテンプレートの記載を下記変更したところ、parseができない旨のエラーが出ました。
{ "keyword": $input.path('$.keyword'), "userId": $input.path('$.userId'), "groupId": $input.path('$.groupId') }
{"message": "Could not parse request body into json: Could not parse payload into json: Unexpected character (\',\' (code 44)): expected a value\n at [Source: (byte[])\"{\r\n \"keyword\": ,\r\n \"userId\": ,\r\n \"groupId\": \r\n}\"; line: 2, column: 15]"}
- GAS側のリクエストボディをbodyに変更しましたが、リクエストボディが空のまま渡る結果は変わりませんでした。
Javascript
1 var options = { 2 'method': 'POST', 3 'headers': { 4 'Content-Type': 'application/json' 5 }, 6 'body': JSON.stringify(params), // payloadでなくbodyに変更 7 muteHttpExceptions: true 8 };

あなたの回答
tips
プレビュー