2021/06/28

SalesforceのRestResourceとは?SalesforceのRestResourceの概要や使い方をご紹介

 
  

Salesforce RestResourceとは?

SalesforceのRestResourceとは、Salesforceで用意されているApexアノテーションの一つです。 SalesforceのApexアノテーションとは、メソッドやクラスの使用方法を変更するもので、宣言する際は@記号を付けて記述します。メソッドにApexアノテーションを宣言する場合は、メソッド定義やクラス定義の直前に記述します。 以下はApexアノテーションの一つである「Futureアノテーション」(@future)の宣言例です。対象のメソッドの直前に宣言します。Futureアノテーションはメソッドを非同期で実行させる場合に使用します。
global class MyClass {
     @future
     Public static void myMethod(String a)
     {
          //long-running Apex code
     }
}

RestResourceアノテーション

RestResourceアノテーションは、SalesforceのApexクラスをRESTリソースとして公開するためのものです。 RestResourceアノテーションを使用すれば、REST APIでApexクラスの処理を実行することが可能になります。実際にREST APIからApexクラスの処理を実行する場合、以下のようなパスになります。 https://instance.salesforce.com/services/apexrest/{指定URL}/ 例えば、RestResourceアノテーションで、「@RestResource(urlMapping=’/Account/*’)」と宣言した場合、以下のようなパスになります。 https://instance.salesforce.com/services/apexrest/Account/

RestResourceアノテーションの留意点

SalesforceのRestResourceアノテーションでは、以下のような留意点があります。 1. URLパスは「https://instance.salesforce.com/services/apexrest/{指定URL}」となります。 2. ワイルドカード文字「*」が使用できます。 3. URLパスでは、大文字と小文字が区別されます。 4. SalesforceでRestResourceアノテーションを使用する場合は、Apexクラスをグローバル定義しておく必要があります。

URLパスのルール

RestResourceのURLパスの対応付けルールは次の通りです。 1. URLパスは、「/」で開始します。 2. 「*」がある場合、その前と後に「/」を付ける必要があります。ただし、「*」がURLパスの末尾である場合は後ろの「/」は不要です。 3. 常に完全一致が優先となります。 4. 完全一致がない場合は、ワイルドカード「*」で一致するすべてのパターンを検索して、一致した中の一番長い文字列が選択されます。 5. ワイルドカード「*」で一致するものが無い場合、HTTP応答状況コード404を返します。 6. 名前空間のあるクラスの場合はURLパスに名前空間が含まれます。 https://instance.salesforce.com/services/apexrest/{名前空間}/{指定URL}/

RestResourceサンプルコード(1)

以下は、レコードの削除、取得、更新を行う3つのHTTP要求メソッドのサンプルコードです。
@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {

    @HttpDelete
    global static void doDelete() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Account account = [SELECT Id FROM Account WHERE Id = :accountId];
        delete account;
    }

    @HttpGet
    global static Account doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId];
        return result;
    }

    @HttpPost
    global static String doPost(String name,
        String phone, String website) {
        Account account = new Account();
        account.Name = name;
        account.phone = phone;
        account.website = website;
        insert account;
        return account.Id;
    }
}

サンプルコードの説明

以下にサンプルコードの説明をします。 1. @RestResourceで指定URLに「/Account/*」を宣言しています。 2. @HttpDeleteを宣言することで、HTTP DELETE要求が送信されるとdoDeleteメソッドを実行します。 3. @HttpGetを宣言することで、HTTP GET要求が送信されるとdoGetメソッドを実行します。 4. @HttpPostを宣言することで、HTTP POST要求が送信されるとdoPostメソッドを実行します。

doGetメソッドのコール

サンプルコードで、クライアントからdoGetメソッドをコールする場合は、コマンドラインウィンドウにコマンドを入力し実行します。 入力するのは次のコマンドです。
curl -H "Authorization: Bearer sessionId"
"https://instance.salesforce.com/services/apexrest/Account/accountId"
「sessionId」には、ログイン時のsessionIdを指定します。 「instance」には、Server URLを指定します。 「accountId」には、取引先IDを指定します。 doGetメソッドをコールした後、Salesforceからは次のようなJSON応答が返ってきます。
{
  "attributes" :
    {
      "type" : "Account",
      "url" : "/services/data/v22.0/sobjects/Account/accountId"
    },
  "Id" : "accountId",
  "Name" : "Acme"
}

RestResourceサンプルコード(2)

次のサンプルコードは、もう少しシンプルなものです。 以下のサンプルコードでは、HTTP GET要求時はパラメータから名前を取得して文字列を返し、HTTP POST要求時は引数から名前を取得して文字列を返します。
@RestResource(urlMapping='/SayGoodbye/*')
global with sharing class SayGoodbyeApi {

    @HttpGet
    global static String doGet() {
        RestRequest req = RestContext.request;
        String name = req.params.get('name');
        return 'Goodbye ' + name;
    }

    @HttpPost
    global static String doPost(String name) {
        return 'Goodbye ' + name;
    }
}

サンプルコードのテストプログラム

以下はサンプルコードをテストするプログラム例です。 isTestアノテーションは、テスト用のメソッドやクラスを定義する場合に使用します。
@isTest
private class SayGoodbyeApiTest {

    /*** Postの確認を行う ***/
    private static testMethod void doPostTest() {
        String result;
        Test.startTest();
        result = SayGoodbyeApi.doPost('MyName');
        Test.stopTest();
        system.assertEquals(result, 'Goodbye MyName');
    }

    /*** Getの確認を行う ***/
    private static testMethod void doGetTest() {
        String result;
        RestRequest req;
        RestResponse res;

        // リクエストの作成
        req = new RestRequest();
        req.httpMethod = 'GET';
        req.requestURI = '/services/apexrequest/SayGoodbye/?name=MyName';

        // レスポンスの作成
        res = new RestResponse();

        // コンテキストの設定
        RestContext.request = req;
        RestContext.response = res;
        Test.startTest();
        result = SayGoodbyeApi.doGet();
        Test.stopTest();
        system.assertEquals(result, 'Goodbye MyName');
    }
}

RestResource 外部からの呼び出し

外部からメソッドをコールする場合は事前にSalesforceの認証を行ってから呼び出す必要があります。 Salesforceにログインし「設定」→「作成」→「アプリケーション」→「接続アプリケーション」で認証を行います。 項目「コンシューマ鍵」、「コンシューマの秘密」と、ログイン時の「ユーザ名」、「パスワード」で認証を行い、アクセストークンを受け取ります。受け取ったアクセストークンをHTTPヘッダに設定すれば、REST APIメソッドをコールすることが可能となります。

SalesforceのRestResourceを活用しよう!

今回は、SalesforceのRestResourceアノテーションについて説明しました。 RestResourceアノテーションを使用すれば、外部からApexクラスの処理を呼び出すことが可能となります。ぜひ理解して活用できるようにしておきましょう。]]>

ITエンジニアへのキャリアチェンジならキャリアチェンジアカデミー

この記事の監修者・著者

株式会社オープンアップITエンジニア
株式会社オープンアップITエンジニア
未経験からITエンジニアへのキャリアチェンジを支援するサイト「キャリアチェンジアカデミー」を運営。これまで4500人以上のITエンジニアを未経験から育成・排出してきました。
・AWS、salesforce、LPICの合計認定資格取得件数:2100以上(2023年6月時点)
・AWS Japan Certification Award 2020 ライジングスター of the Year 受賞

おすすめの動画

  • 【未経験からIT業界へ転職するなら】相談窓口とスキルの獲得はここで解決!IT転職が一気に有利に!【キャリアチェンジアカデミー】

  • 【費用一切不要】未経験からIT業界へ転職するならまずはここへ相談!【キャリアチェンジアカデミー】

  • 【何のエンジニアになれるのか?】未経験からITエンジニアを目指すとこんな道がある【キャリアチェンジアカデミー】