curlコマンドとkintone.proxy() の対応
警告
2020年8月改訂のセキュアコーディングガイドライン
に抵触する内容が含まれています。認証情報が漏洩した場合の影響を考慮して慎重に検討してください。
該当箇所:JavaScriptプログラムの7行目。
はじめに
Webサービスのいち機能として提供されることが当たり前になってきたWeb-APIですが、これをkintoneでマッシュアップしたいと思った時に役立つ豆知識をひとつ紹介します。
ドキュメントでAPIへのアクセス方法としてサンプルでよく使われるcurlコマンドと、kintone JavaScriptカスタマイズで外部のAPIへアクセスできる
kintone.proxy()
の対応関係を整理します。
さらにサンプルを通してkintone.proxy() による外部Webサービスとの連携方法について理解を深めたいと思います。
なお、kintone.proxy() に関する内容は現時点で確認したもので、今後拡張・変更されることがあるかもしれませんので、ご注意ください。
curlコマンドとkintone.proxy() の対応関係
APIドキュメントのページでcurlコマンドの例が与えられたときに、kintone.proxy() でどのように読み替えたらよいか、対応関係をまとめたいと思います。
curlコマンド (オプションと値) |
kintone.proxy(url, method, headers, data, callback, errback) |
|
---|---|---|
リクエストURL | http://xxx.xxx.xxx |
記載箇所:第1引数url 記載例: 'http://xxx.xxx.xxx' |
リクエストメソッド | -X {method} |
記載箇所:第2引数method 記載例:'{method}' |
リクエストヘッダー | -H "{headerKey}:{headerValue}" |
記載箇所:第3引数headers 記載例: {"{headerKey}":"{headerValue}"} |
リクエストデータ(フォーム形式) | -d "{key}={value}" |
記載箇所:第4引数date 記載例: ' "{key}={value}" ' |
リクエストデータ(JSON形式) | -d 'JSON文字列' |
記載箇所:第4引数date 記載例: 'JSON文字列'もしくはJSONオブジェクト |
Basic認証 | -u "{id}:{password}" |
記載箇所:第3引数headers 記載例: '{"Authorization" : "Basic {basicToken}"}' |
各項目の補足説明は次のとおりです。
リクエストURL
- curlコマンドでは正味の引数になりますので、コマンドオプションはありません。
リクエストメソッド
GET
POST
PUT
DELETE
のいずれかを指定できます。
リクエストヘッダー
- 複数指定する必要があるときには、curlコマンドでは
-H "{headerKey}:{headerValue}"
をセットとして、必要数書き並べられます。kintone.proxy() では「{"{headerKey1}":"{headerValue1}", "{headerKey2}":"{headerValue2}", ・・・}」
といったようにカンマで必要数を連結してください。
リクエストデータ(フォーム形式)
- curlコマンドで
-d
のオプションでは通常フォーム形式データです。対応するContent-Typeはapplication/x-www-form-urlencoded
として処理されています(-H
での明示不要)ので、kintone.proxy() ではこれをヘッダーに追加しておくとよいです。 - 複数指定する必要があるときには、curlコマンドでは
-d {key}:{value}
をセットとして、必要数書き並べられます。kintone.proxy() では、'{key1}={value1}&{key2}={value2}&・・・'
といったように&
で必要数連結してください。 - curlコマンドでは
{value}
部分をURLエンコード化する--data-urlencode
というオプションが使われます。これに対応するためにはkintone.proxy()では、JavaScript中でencodeURIComponent({value})
を経由させておくとよいです。
リクエストデータ(JSON形式)
- curlコマンドで
-d
のオプションはJSON形式のデータにも対応しています。ただ、先ほどのフォーム形式と異なり、対応するContent-Typeのapplication/json
はcurlコマンドでも-H
によって明示されることになります。一方、kintone.proxy() でもこれをヘッダーに追加しておく必要があります。 - curlコマンドでは「JSON文字列」でしか指定のしようがありませんが、kintone.proxy() では、「JSON文字列」でも「JSONオブジェクト」でも大丈夫です。
Basic認証
- curlコマンドで
-u
のオプションはBasic認証に用いられています。
これをkintone.proxy()
に対応させるには、ヘッダーの方に"Authorization":"Basic {BasicToken}"
と追加します。 {BasicToken}
は、{id}:{password}
をBASE64エンコードした値です(kintone REST APIと同じですね)
さて、予備知識を確認したところで、実践に移っていきたいと思います。kintoneに触れられている方ならJSON形式データの取扱には慣れているかと思いますので、今回は用例も少ないフォーム形式データの例をお届けしたいと思います。
連携サンプル(Twilio /電話:フォーム形式データ)
kintone APIをはじめとして、フォーム形式データのAPIを提供しているサービスはいくつかあります。次はその一例です(著者自身でkintone.proxy() からのアクセスをそれぞれ確認しました)。
- Twilio ( KDDIウェブコミュニケーションズ )
- SendGrid ( SendGrid )
今回はその中から「Twilio」の「電話(Call)」を例に進めていきたいと思います。
kintoneアプリとしては、kintoneに登録された電話番号とメッセージをもとにTwilio API経由で音声通知するというものになります。
Twilioには、テスト用の無料のトライアル電話番号が提供されています。
トライアル電話番号を取得する方法は、次のページを参照してください。
Twilioフリートライアルアカウントに関して
APIドキュメント(Twilio)で示されるcurlコマンドによるAPIリクエスト例
(「 https://www.twilio.com/en-us/voice/api 」より)
トライアルアカウント作成後にもこれと同じようなページが出現しますが、この情報を参考に、kintoneアプリとカスタマイズ用のJavaScriptを準備していきましょう。
認証情報
パラメーター |
説明 |
---|---|
{AccountSid} |
アカウント取得時に与えられるID |
{AuthToken} |
アカウント取得時に与えられるパスワード |
リクエストデータ
パラメーター |
説明 |
---|---|
To='{To}' |
{To}は宛先番号。「+819012345678」のようにハイフンなしの国際電話表記 |
From='{From}' |
{To}は宛先番号(アカウント取得後指定される)。「+819012345678」のようにハイフンなしの国際電話表記 |
Url='{twiMlUrl}' |
{twiMlUrl}は、TwiML(TwilioのXML)をホストしているURL。Twimletsを利用することで、動的に設定可能 |
詳しいTwilio APIのドキュメントは Twilio Doc を確認してください。
kintoneアプリの準備
次のフィールドを含むアプリをご準備ください。
フィールド名(例) |
フィールドコード |
フィールドタイプ |
---|---|---|
宛先番号 |
To |
リンク(電話番号)もしくは、文字列1行 |
メッセージ |
Body |
文字列複数行 |
JavaScriptソースコード
|
|
動作確認
「ダイヤル」ボタンを押して、「電話をかけました!」とメッセージが出れば発信成功です。そして、宛先の電話で着信するとメッセージが流れます。
トライアルでは、登録した番号のみへ発信可能で、案内メッセージが流れます。
注意事項
今回のkintoneアプリ周辺の注意点は次のとおりです。
- 筆者はmacOSのGoogle Chromeでkintoneアプリの動作確認を行いました。cybozu.comの対応Webブラウザーは 動作環境 を参照してください。
- JavaScript中に認証情報を含んでいますので、必要に応じて都度入力にしたり、アクセス権を制限する等設定してください。
- 冒頭でも述べましたとおり、kintone.proxy() に関する内容は現時点で確認したもので、今後拡張・変更になることがあるかもしれませんので、ご注意ください。
- 今回例に挙げたTwilio APIの取扱いを含め、サンプルの利用に際しては自己責任でお願いします。
おわりに
今回は、外部サービスで提供されるAPIをkintone.proxy()でアクセスするための豆知識としてcurlコマンドとの対応関係について触れ、サンプルを紹介しました。
kintone.proxy() は、今回のサンプルのように組み合わせ次第では本来サーバーを必要となるような開発がサーバーレスでできてしまう優れ機能です。
この機能を使った事例は
「kintone Café 東京Vol.1」発表レポート
で紹介されました。(
資料
)
外部サービスとのAPI連携が必要になった際にはkintoneとkintone.proxy() でのマッシュアップを検討されてはいかがでしょうか?
このTipsは、2014年9月版kintoneで動作を確認しています。