概要
IFTTT
を利用してGoogle Assistant
からの入力文字列を、Webhook経由でWebAPIへクエリストリングで渡すときに、HTTP Status 400(Bad Request)が出てハマったのでメモしておきます。
発生した環境と現象
下記経路のngrok
の呼び出し時にHTTP Status 400(Bad Request)になります。
通信経路
Google Home
⇒ IFTTT( if Google Assistant then WebHooks )
(*1) ⇒ ngrok
⇒ WebAPI
(*2)
*1 IFTTT -> MyAppletの設定
Google Assistant(Say a phrase with a text ingradient)
項目 | 設定 |
---|---|
What do you want to say? | ブラウザ検索 $ |
What's another way to say it? | |
And another way? | |
What do you want the Assistant to say in response? | |
Language | Japanese |
Webhooks(Make a web request)
項目 | 設定 |
---|---|
URL | https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<{{TextField}}>> |
Method | GET |
Content Type | text/plain |
Body |
*2 WebAPIのソース(nodejs)
const express = require('express');
let app = express();
app.listen(3000);
app.get("/api/ctl", async function (req, res, next) {
console.log(req.query);
...
}
調べてみた
##1.ngrok
を通さないときに、どんなリクエストが来るか確認してみる。
URL
https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<{{TextField}}>>
レスポンス
文字化けしています。エスケープも効いていません。
{ c: 'search', v: '<<ƹÈ>>' }
##2.<<<
>>>
でのエスケープをダメ元で確認
Web上で検索すると<<<
と >>>
で囲むという記載も見受けられますのでまさかと思い、試してみました。
URL
https://xxxxxxxx.ngrok.io/api/ctl?c=search&v=<<<{{TextField}}>>>
レスポンス
なんと・・・文字化けしていません。
{ c: 'search', v: 'テスト' }
原因
IFTTT
画面上のコメント間違いでした。実際は、IFTTT
のWebHook(Make a web request)
でのURLエンコードは<<<
>>>
が正しいようです。
おまけ
2018/08/23時点ではescapeは<<
>>
と記載されていました。