Apex Web サービス

trailhead.salesforce.com

クラス2つ作る。

1.

class ①
動作する。AccountManager.apex

@RestResource(urlMapping='/Accounts/*/contacts')
global with sharing class AccountManager {
    @HttpGet
    global static Account getAccount(){
        RestRequest request = RestContext.request;
        // grab the accoutId from the end of the URL
        List<String> paramList = request.requestURI.split('/');
        Integer accIdNum = paramList.size()-2;
        String accountId = paramList[accIdNum];
        Account result = [SELECT Id, Name, (Select id, name from Contacts)
                          FROM Account 
                          WHERE Id = :accountId];
        return result;
        
    }

}

2.

class ②
class ①をテストする。AccountManagerTest.apex

@isTest
private class AccountManagerTest {
    @isTest static void testGetAccount(){
        Id recordId = createTestRecord();
        RestRequest request = new RestRequest();
        request.requestURI = 
            'https://curious-hawk-6yiw16-dev-ed.salesforce.com/services/apexrest/Accounts/'+ recordId +'/contacts'
            ;
        request.httpMethod = 'GET';
        RestContext.request = request;
        Account thisAcc = AccountManager.getAccount();
        System.assert(thisAcc != null);
        System.assertEquals('dotoru', thisAcc.Name);
    }
    
    //Helper method
    static Id createTestRecord(){
        //Create test record
        Account accountTest = new Account(
        Name = 'dotoru');
        insert accountTest;
        return accountTest.Id;
    }
}

迷ったのは、

  • urlの真ん中にあるパラメータ(*で書いてあるレコードId)をどう取得するか
String accid= request.requestURI.substringBetween('Accounts/','/contacts');
 

こんな方法もあった!

  • challenge確認 ERROR
Account result = [SELECT Id, Name
                          FROM Account 
                          WHERE Id = :accountId];

AccountManager.apexここでSOQL文をこんな感じで書いてたら、エラーでパスができない!

Executing the 'AccountManager' method failed. Either the service isn't configured with the correct urlMapping, is not global, does not have the proper method name or does not return the requested account and all of its contacts.

探してみたら、Contactsの情報も取得することでパスできた!!

Account result = [SELECT Id, Name, (Select id, name from Contacts)
                          FROM Account 
                          WHERE Id = :accountId];