DataSpiderを使ったSalesforce連携のはじめかた

こんにちは、テラスカイ製品開発部の荒木と申します。
さて今回は、私共テラスカイの十八番でありますSalesforceとの連携について投稿したいと思います。

#Salesforce連携ってむずかしい？
答えは "No" です。DataSpiderのような連携ツールを導入すればあっという間にリリースまでいけちゃいます。特に、Salesforceに用意されているクラウドならではのサービスはDataSpiderとの相性がよく、すぐに開発を始めることができます。

#開発環境を作成する
DataSpiderは手元にありますね？
では、Salesforceの開発環境を準備しましょう。開発者向けに無償提供されているDeveloper Editionは、誰でもすぐに使用開始することができます。
https://developer.salesforce.com/signup

サインアップして通知されるメールに従って操作すると、あっという間に自分専用の開発環境へアクセスすることができます。

#DataSpiderから接続するために
この時点で、ブラウザでは接続できていますが、このままではDataSpiderから接続することはできません。DataSpiderからはAPIで接続することになりますが、APIから接続するためのセキュリティ許可がされていないためです。
下記の２通りの許可方法があります。
・ __セキュリティトークンを発行する__
・ __接続元IPアドレスを許可する__

今回は、後者の設定を行ってみたいと思います。
1. 画面右上の[設定]を選択
2. サイドバーの[管理]-[ユーザの管理]-[ユーザ]を選択
3. サインアップで入力したユーザの[プロファイル]リンクを選択（システム管理者になっているはずです）
4. プロファイルのページ下部へスクロールして[ログイン IP アドレスの制限]の[新規]を押下
5. 接続元となるIPアドレス範囲を指定して保存
![ip.jpg](https://qiita-image-store.s3.amazonaws.com/0/149796/7cd96d82-dcf8-b3da-377d-d45e662c408e.jpeg)


上記手順により、該当のプロファイルに属するユーザについて、指定したIPアドレス範囲からのAPI接続が可能となります。ただし、この設定を行うとAPI以外の接続も指定したIPアドレス範囲しか接続できなくなりますので注意が必要です。また、蛇足ですが組織の信頼済IP範囲も設定していた場合にはプロファイルのIPアドレス範囲が優先されます。

#Salesforceアダプタで接続してみる
では、DataSpiderのSalesforceアダプタから開発環境へ接続してみましょう。グローバルリソース接続設定の新規作成で[Salesforce接続設定 API34.0]を選択します。いくつかの認証方式がありますが、もっとも簡単に始められる認証方法はID/パスワードによる認証です。
[必須設定]タブの[ユーザID][パスワード]へ値を設定し「接続テスト」ボタンを押下します。
テストに成功すれば、DataSpiderでSalesforceアダプタを使用する準備は完了です。各コンポーネントを使用してスクリプト開発を行うことができます。

#Sandboxを使用して開発する
開発環境は容易に準備することができました。しかし、既にカスタマイズされている本番環境のSalesforceに対してスクリプト開発を行いたい場合はどうすればよいでしょう？Salesforceには本番環境の複製を作成できるSandboxがあります。この機能を利用して、複製したSandboxを接続先とした開発を行い、リリースの際に接続先を本番へ向けることが一般的です。

Salesforceアダプタの接続先をSandboxへ向けるには、グローバルリソースのプロパティ[ログイン先]で[SandBox]を選択します。

Sandboxを利用して開発する場合、グローバルリソースの種別を使用すると便利です。例えば、種別[テスト用]はSandbox、種別[本番用]は本番環境へ接続するように設定しておけば、容易に開発フェーズと運用フェーズを切り替えることができます。

#SalesforceからDataSpiderの処理を起動
SalesforceをクライアントとしてDataSpiderの処理を起動する場合にはどうしたらよいでしょう。この場合、DataSpider側ではHTTP/Webサービストリガーを使用します。
Salesforceからトリガーへリクエストを送信するには下記のような方法があります。
・ __画面のリンクやボタンをカスタマイズしてブラウザからHTTPリクエストを送信する__
・ __Apexコールアウトリクエストを送信する__
・ __アウトバウンドメッセージアクションでWebサービスリクエストを送信する__
(下ふたつはサーバサイドで実行されるため、DataSpiderをDMZに構築するなどファイアウォール超えを検討する必要があります。)

今回は、画面のリンクやボタンをカスタマイズ、Apexコールアウトリクエストのサンプルを紹介したいと思います。（アウトバウンドメッセージアクションはまたの機会に）

###画面のリンクやボタンをカスタマイズ
標準オブジェクトの「取引先(Account)」の画面へ、HTTPトリガーへリクエストを送信するボタンを配置してみたいと思います。
[設定]-[ビルド]-[カスタマイズ]-[取引先]-[ボタン、リンク、およびアクション]から[新規ボタンまたはリンク]を選択して、下図のようにカスタムボタンを設定します。
![custombutton.jpg](https://qiita-image-store.s3.amazonaws.com/0/149796/839693c1-f15d-de7a-c50c-3e98fe2ab02b.jpeg)

次に、[設定]-[ビルド]-[カスタマイズ]-[取引先]-[ページレイアウト]から、[Account Layout]の編集リンクを選択します。表示されたページレイアウトエディタにて、作成したボタンを[カスタムボタン]の位置へドラック＆ドロップして保存します。
![pagereyout.jpg](https://qiita-image-store.s3.amazonaws.com/0/149796/173e6511-e594-0e39-be6c-da1289131ed5.jpeg)

取引先の詳細ページを表示すると作成したボタンが表示されています。クリックすると、HTTPトリガーのレスポンスが表示されることが確認できました。
![accout.jpg](https://qiita-image-store.s3.amazonaws.com/0/149796/51faf822-dd71-f124-cc71-a9f06e0592e2.jpeg)

今回はカスタムボタンの内容ソースを[URL]としましたが、[OnClick JavaScript]を選択することでPOSTメソッドを実行するとこも可能です。この場合、Salesforceのjsライブラリ(connection.jsなど)を使用すれば、Salesforceのデータをもとにリクエストボディを動的に作成して、HTTPトリガーの引数として渡すこともできますね。

###Apexコールアウトリクエスト
Apexとは、Force.comプラットフォーム上で実行されるJavaライクなプログラミング言語です。HTTPコールアウトを実装したメソッドは下記のようになります。

```CalloutSample.apxc
public class CalloutSample {
    public static void callHttpTrigger(){
        HttpRequest req = new HttpRequest();
        // Request details
        req.setMethod('POST');
        req.setEndpoint('http://yourhost:7700/dataspider/trigger/path');
        // req.setHeader(key, value);
        // req.setBody(data);

        Http http = new Http();
        try{
            HTTPResponse res = http.send(req);
        }catch(CalloutException e){
            // Error handling
            System.debug(LoggingLevel.INFO, 'ERROR:' + e.getMessage());
        }
    }
}
```

あとはこのメソッドをControllerやApexTriggerなどから実行します。なお、非同期実行が求められるクラスから実行する場合は、`@future (callout=true)`アノテーションが必要だったりしますが、今回は割愛します。
また、コールアウトする外部サイトは [管理]-[セキュリティのコントロール]-[リモートサイトの設定] へ事前に登録しておく必要があります。

#最後に
今回は、Salesforce連携のはじめかたと題して環境構築や基本的な連携方法について投稿してみました。今後機会があれば、具体的な連携パターンやSalesforce連携あるあるなど紹介できればと思います。