[Salesforce][Force.com]外部サイトにHTTPアクセス(Callout)する | Salesforceで開発したり

Salesforceで開発したり

Salesforce.comに触れ始めてからもう7年
当時から比べたら相当な進化を遂げている。
出来る事が増えた分、やり方を調べなきゃいけないので、日常と共にメモで残そうというお話。

今回のSalesforceネタですが



アドベントカレンダー2012
Force.com Advent Calendar 2012

Facebookページ
Japan Force.com Developer Group


向けの記事になります。
2012年12月20日担当でしたが、
動作確認とかしていたら21日になっていました。。
失礼致しました。

気を取り直して、今回話題にしたいのは
[Force.comプラットフォーム上から外部サイトとAPI連携したい]なー、
みたいな時に利用するcalloutという仕組みについて。

これだけTwitterやFacebookが流行っている世の中、利用するシーンは無限大
それだけにみんなもう実践しているかと思いますが、まとめの意味も込めて。


さて、内容が目新しい物ではないという予防線を貼った所で具体的な内容ですが
このcalloutという仕組み、制限があります。
Force.com開発者は驚きもしないでしょうが。

まずは、回数制限
※一連の処理(Apex起動~処理終了まで)の間に10箇所まで設置することができます。(しかできません。)
※1日(24時間)で200Calloutが制限になり、それぞれ、それ以上実行するとエラーになります。

さらに呼び出し方にも注意点があります。
※callout(外部サイトからデータ取得)してからForce.comでそのデータを登録(DML)
※DMLでデータ取得してからcallout(外部サイトにデータ登録
上記の様な流れでしか呼出はできず、calloutの前後両方にDMLを設置したり
逆にDML前後両方にcalloutするとエラーになります。


最後に実装ですが、こちらはとても簡単。




メソッド定義

@future(callout=true)
public static void calloutHttpAccess(){
// ※1
Http http = new Http();

HttpRequest request = new HttpRequest();

request.setEndpoint('http://****アクセスしたいAPIのURLだよ!****');

request.setMethod('POSTとかGETとか!');

request.setHeader('Accept','text/plain, */*');

request.setHeader('Accept-Charset','Shift_JIS,utf-8;q=0.7,*;q=0.3');

request.setHeader('Accept-Encoding','gzip,deflate,sdch');

request.setHeader('Accept-Language','ja,en-US;q=0.8,en;q=0.6');

request.setHeader('Connection','keep-alive');

request.setHeader('Content-Type','text/xml; charset=UTF-8 ');

HttpResponse response = http.send(request);
String responseBody = response..getBody();
// ※2
}


※1 / ※2のどちらかにしかDMLは使えません。
また、普通の感覚だったら※1~※2までの間は別メソッドにすると思いますのでその様に。
まぁ普通にJavaでHttpRequestを利用したプログラムを書いたことあればすぐわかるような内容でした。


ちなみに、Force.comでの開発で必須であるテスト実装についてですが
callout呼出があるとテストが止まっちゃいます。

そこで、メソッドを実装するクラスに、public booleanなフラグを持って、デフォルトはOFF(false)にしておきます。
・フラグがoffの時は通常のcallout呼出をするように。
・フラグがonの時はcalloutを経由せずに文字列等のダミー結果をreturnするようにしておきます。

テストメソッドから呼び出す時にだけ、メソッド呼び出し前にON(true)にしてあげれば
テストではcalloutせずに、通常実行時のみcalloutされるようになります。(当たり前ですけど

この記述だと、OFFの時の分岐を通らなくなるのでテストカバレッジは少し下がっちゃいますけど
まぁcallout後が全部テストできないよりはずっといいんでないかと。

以上、今回はcalloutのお話でした。