Salesforceでは、自分でREST APIを作成して、それを外部のプログラムから呼ぶことができます。
ここでは、REST APIの作成方法と、GETやPOSTでのCallの仕方、それぞれのメソッドで引数を取得して、それを解析する方法もご紹介します。
※作成した自作のRESTを外部から呼ぶ方法については、こちらの記事をご参照ください。ブラウザでの呼び出し方法ですが、同じ様なことをJavaなどのプログラムで行えば、プログラムからも呼び出し可能です。
SalesforceでのREST APIの作成
アノーテーション「@RestResource」を使うとRESTサービスを作ることができます。
まずは、例を見てみましょう。
@RestResource(urlMapping='/MyRestServices/*')
global class MyRestController {
@HttpGet
global static ReturnObj getAccountInfo() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
// パラメータ取得
String param1 = req.params.get('param1');
return '' ;
}
@HttpPost
global static String updateAccountInfo() {
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
// パラメータ取得
Map<String, Object> requestParams = (Map<String, Object>)JSON.deserializeUntyped(req.requestBody.ToString());
Map<String, Object> resultParam2 = (Map<String, Object>)requestParams.get('param2');
String resultParam2_1 = (String)resultParamKokyaku.get('param2_1');
List<Object> resultParams = (List<Object>)requestParams.get('param3');
for (Object obj : resultParams) {
Map<String, Object> params = (Map<String, Object>)obj;
String eventType = (String)params.get('param3_1');
}
return '';
}
}
アノーテーションのプロパティに(urlMapping=’/MyRestServices/*’)とありますが、これは、MyRestServicesというURLで以下のHTTPメソッドを公開するという意味です。
メソッド(GET,POST,PUT,DELETE等)は、1つのRestクラス(ここではMyRestController )で各一つずつ定義することができます。
「*」は、各クラスメソッド名がそのままURLにマッピングされるということになります。
RESTを作成すると、決められたエントリポイントで公開され、たとえば、MyRestController.getAccountInfo()は
「https://<SFDCインスタンス>/services/apexrest/MyRestServices/getAccountInfo」
でCallすることができます。
パラメータの解析
さて、RESTを呼び出すことができるようになったら、HTTPのリクエストで渡された引数を取得することにしましょう。
一つ目はGETパラメータで、<URL>/getAccountInfo?param1=aaaa
のような形で渡ってきます。
この場合は、「 req.params.get(‘param1’)」のように、パラメータ名を引数に取得します。
POSTのパラメータがJson形式でわたってきた場合は、クラスを定義して、MyRestController.updateAccountInfo(定義したクラス)のようにすると、Salesforceで自動でJsonのでシリアライズが行われます。
ただ、この方法だと、インターフェースが変更になった場合にエラーを起こしやすいため、私は、Stringで取得し、Jsonのパースを行った後で、Mapのキー名で取得するようにしています。
Map<String, Object> requestParams = (Map<String, Object>)JSON.deserializeUntyped(req.requestBody.ToString());
の部分ですね。
パースが行われると、Map<String, Object>形式で格納されますので、パラメータ名で簡単に値を取得できます。
上記のサンプルでは、
{“param2”:{“param2_1” : “aaaaa”,”param2_2″ : “bbbbb”},
“param3”:[{“param3_1”: “cccccc”, “param3_2”: “dddddd”},{“param3_1”: “eeeee”, “param3_2”: “fff” }]}
のような、入れ子で、配列の形のJsonから値を取得しています。