SalesforceでRestAPIを自作し、外部からPOST/GETで呼ぶ方法とJson引数の解析

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<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から値を取得しています。