TrailheadのApex SOAP Calloutsに載っていた内容についてです。
下記HerokuアプリにHTTPRequestを行うとJSON文字列が返ってきます。
Apexの場合はこんな感じです。
public class AnimalLocator { public static String getAnimalNameById(Integer prm) { // Request Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals/' + prm); request.setMethod('GET'); HttpResponse response = http.send(request); // Get Result String result = ''; if (response.getStatusCode() == 200) { Map<String, Object> resultJSON = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); Map<String,Object> animal = (Map<String,Object>) resultJSON.get('animal'); result = (String)animal.get('name'); } return result; } }
テストクラスを実装する際にはモッククラスを用意します。
@isTest global class AnimalLocatorMock implements HttpCalloutMock { // Implement this interface method global HTTPResponse respond(HTTPRequest request) { // Create a fake response HttpResponse response = new HttpResponse(); response.setHeader('Content-Type', 'application/json'); response.setBody('{"animal":{"id":1,"name":"chicken","eats":"chicken food","says":"cluck cluck"}}'); response.setStatusCode(200); return response; } }
実際のテストクラスはこちら
@isTest private class AnimalLocatorTest { @isTest static void testGetAnimalNameById() { Test.setMock(HttpCalloutMock.class, new AnimalLocatorMock()); String result = AnimalLocator.getAnimalNameById(1); System.assertEquals(result, 'chicken'); } }
Apexから外部サイトにコールアウトする場合はリモートサイトの設定が必要です。
コードの細かい部分はちょっと雑にやっちゃいましたがこんな感じです。