質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.42%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

138閲覧

AWS上にあるREST形式のAPIにリクエストボディが渡せない

SasuraiNoTsuba

総合スコア3

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/05/23 17:54

実現したいこと

クライアント側から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 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2023/05/24 09:36

自前でWebサーバーを用意して、一旦リクエストをそっちで受け取れば、クライアント側の問題かAPI側の問題かとりあえずわかると思います。 見た感じ、リクエストを作成してる部分は間違っていなさそうなので、API側の問題のように感じますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.42%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問