TrailHead

【Trailhead】Apex Web サービス

TrailHead
この記事は約6分で読めます。

今回はApexインテグレーションサービスの4つめの単元である、ApexWebサービスにチャレンジしていこうと思います。
やってみた感想ですが、Apexってそんなことできるのか!と驚きでした。
まだまだ知らないことが多々あるんだなあとつくづく思いました。

ではチャレンジやっていきましょう!

Hands-on Challenge

Create an Apex REST service that returns an account and it’s contacts.
To pass this challenge, create an Apex REST class that is accessible at ‘/Accounts/<Account_ID>/contacts’.
The service will return the account’s ID and Name plus the ID and Name of all contacts associated with the account.
Write unit tests that achieve 100% code coverage for the class and run your Apex tests.

  • The Apex class must be called ‘AccountManager’.
  • The Apex class must have a method called ‘getAccount’ that is annotated with @HttpGet and returns an Account object.
  • The method must return the ID and Name for the requested record and all associated contacts with their ID and Name.
  • The unit tests must be in a separate Apex class called ‘AccountManagerTest’.
  • The unit tests must cover all lines of code included in the AccountManager class, resulting in 100% code coverage.
  • Run your test class at least once (via ‘Run All’ tests the Developer Console) before attempting to verify this challenge.

日本語訳

取引先とその取引先責任者を返すApex RESTサービスを作成します。
このチャレンジに合格するには、「/ Accounts / <Account_ID> / contacts」でアクセス可能なApex RESTクラスを作成します。
サービスは、アカウントのIDと名前に加えて、アカウントに関連付けられているすべての連絡先のIDと名前を返します。
クラスに対して100%のコードカバレッジを達成する単体テストを記述し、Apexテストを実行します。

  • Apexクラスは「AccountManager」と呼ばれる必要があります。
  • Apexクラスには、@ HttpGetアノテーションが付けられ、Accountオブジェクトを返す「getAccount」というメソッドが必要です。
  • メソッドは、要求されたレコードのIDと名前、およびそれらのIDと名前を持つすべての関連する連絡先を返す必要があります。
  • 単体テストは、「AccountManagerTest」と呼ばれる別のApexクラスに存在する必要があります。
  • 単体テストは、AccountManagerクラスに含まれるコードのすべての行をカバーする必要があり、100%のコードカバレッジになります。
  • このチャレンジを検証する前に、テストクラスを少なくとも1回実行します(「すべて実行」で開発者コンソールをテストします)。

解答

外部から呼び出した際に取引先とその取引先に関連している取引先責任者を返すRestサービスを作るのが今回の目的です。
Restサービスってそんな簡単に作れてしまうんだって思うくらい、アノテーションで宣言して、オブジェクト指定して。。。。
みたいな感じで、今回もTraihead内のコードを参考に進めていけば問題なく取得できるバッチかと思います。

ではやっていきます。
まず2つのクラスが必要になります。
『AccountManager』『AccountManagerTest』をそれぞれ用意します。

AccountManager

@RestResource(urlMapping='/Account/*')
global with sharing class AccountManager {
    @HttpGet
    global static Account getAccount(){
        RestRequest req = RestContext.request;
        String accountId = req.requestURI.substringBetween('Accounts/','/contacts');
        
        Account objAccount = [
            Select Id,Name,(Select Id,Name From Contacts) From Account Where Id = :accountId
        ];
        
        return objAccount;
    } 
}

AccountManagerTest

@isTest
private class AccountManagerTest{
    @isTest static void test(){
        Account acc = new Account(Name = 'testacc');
        insert acc;
        Contact con = new Contact(LastName = 'testcon',AccountId = acc.Id);
        insert con;
        Id accId = acc.Id;
        
        RestRequest req = new RestRequest();
        req.requestURI = 'https://sandeepidentity-dev-ed.my.salesforce.com/services/apexrest/Accounts/'
     + accId+ '/contacts';
        req.httpMethod = 'GET';
        RestContext.request = req;
        
        Account resultAcc = AccountManager.getAccount();
    }
}

今回はこれでテストを行えば、完了になります。

少しややこしかったかもしれないですが、以上となります。
ちなみに余談ですが、SOAPAPIの作成方法はこんな感じになります。

global with sharing class SOAPAPITest {
    webservice static void getRecord(String Name){
        //ここに処理を書く
    }
}

上記のように必ず『webservice』の修飾子と『static』であることが条件になります。
このwebserviceがついているクラスを作成すると設定からのApexクラスにWSDLが作成されています。

これを表示したい側でなんやかんやするんですね。

てことでそれはまた別の機会に。
今回のは完了です!お疲れ様でした!

コメント