Google Cloud Functions でhttpトリガータイプの関数を作成したのですが、コールの際、リクエストボディ(jsonデータ)を渡そうとするとエラーが出てしまい、困っています。
- 前提
下記Google CloudのAPIリファレンスサイトの「Try this API」という機能でコールを試しています。
APIリファレンス
- 試したこと
name値にはプロジェクトID、ロケーションID、ファンクションIDをそれぞれ projects/{project_id}/locations/{location_id}/functions/{function_id}
のように設定。
まずは、リクエストボディを指定せずに「EXECUTE」すると正常に Hello World!
とレスポンスされます(下図参照)
ですが、リクエストボディ {"data":"test"}
を指定すると200ステータスでerrorメッセージがレスポンスされます(下図参照)
error文
error": "\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003ctitle\u003eError\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cpre\u003eBad Request\u003c/pre\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n"
なお、Cloud Functionsのトリガータイプはhttpを設定しているため、
httpトリガータイプのURL(下記)からアクセスした場合は正しくリクエストボディ(jsonデータ)が渡ります。
URL → https://<ロケーションID><プロジェクトID>.cloudfunctions.net/<ファンクションID>
httpトリガーでのアクセスではリクエストボディ(jsonデータ)が渡りますが、APIのCALLを利用した場合リクエストボディが渡せないという状況です。(認証はOAuth2を利用)
下記、Cloud Functions側の情報です。
- ソース
ランタイムがNode.js 8でソースはサンプルのまま変更していません。
javaScript
1/** 2 * Responds to any HTTP request. 3 * 4 * @param {!express:Request} req HTTP request context. 5 * @param {!express:Response} res HTTP response context. 6 */ 7exports.helloWorld = (req, res) => { 8 let message = req.query.message || req.body.message || 'Hello World!'; 9 res.status(200).send(message); 10}; 11
- 認証
「未認証の呼び出しを許可する」のレ点チェックは外しています。
IAMで Cloud Functions管理者
を役割に設定したサービスアカウントから呼び出す想定のため。
- ソースコード
インラインエディタ
補足:最終的には google-api-php-client を使いAPICALLを実装しようと考えていますが、まずはAPIリファレンスの「Try this API」やpostmanにて疎通を確認している状態です。
よろしくお願いいたします。
あなたの回答
tips
プレビュー