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パラメータの場合
一つ目はGETパラメータで、<URL>/getAccountInfo?param1=aaaa
のような形で渡ってきます。
この場合は、「 req.params.get(‘param1’)」のように、パラメータ名を引数に取得します。
POSTパラメータ(Json)の場合
POSTのパラメータがJson形式でわたってきた場合は、クラスを定義して、MyRestController.updateAccountInfo(定義したクラス)のようにすると、Salesforceで自動でJsonのでシリアライズが行われます。
ただ、この方法だと、インターフェースが変更になった場合にエラーを起こしやすいため、私は、Stringで取得し、Jsonのパースを行った後で、Mapのキー名で取得するようにしています。
Map
の部分ですね。
パースが行われると、Map
上記のサンプルでは、
{“param2”:{“param2_1” : “aaaaa”,”param2_2″ : “bbbbb”},
“param3”:[{“param3_1”: “cccccc”, “param3_2”: “dddddd”},{“param3_1”: “eeeee”, “param3_2”: “fff” }]}
のような、入れ子で、配列の形のJsonから値を取得しています。