Apex Web サービス
クラス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];