Apex REST ã³ãŒã«ã¢ãŠã
åŠç¿ã®ç®ç
ãã®ã¢ãžã¥ãŒã«ãå®äºãããšã次ã®ããšãã§ããããã«ãªããŸãã
- ã³ãŒã«ã¢ãŠããå®è¡ããŠãå€éšãµãŒãã¹ããããŒã¿ãåä¿¡ããã
- ã³ãŒã«ã¢ãŠããå®è¡ããŠãå€éšãµãŒãã¹ã«ããŒã¿ãéä¿¡ããã
- ç䌌ã³ãŒã«ã¢ãŠãã䜿çšããŠãã³ãŒã«ã¢ãŠãããã¹ãããã
äžç·ã«ãã¬ã€ã«ãé²ã¿ãŸããã
ãšãã¹ããŒãã®èª¬æãèŠãªãããã®ã¹ããããå®è¡ãããå Žåã¯ã次ã®åç»ãã芧ãã ããããã㯠Trailhead Live ã®ãTrail Togetherã(äžç·ã«ãã¬ã€ã«) ã·ãªãŒãºã®äžéšã§ãã
(ãã®åç»ã¯ 7:54 ã®æç¹ããå§ãŸããŸããæ»ããŠæé ã®æåããèŠçŽãå Žåã¯ã泚æãã ããã)
HTTP ãšã³ãŒã«ã¢ãŠãã®åºæ¬
REST ã³ãŒã«ã¢ãŠãã¯ãHTTP ã«åºã¥ããŠããŸããHTTP ã«ã€ããŠããã€ãç解ããŠããããšã§ãã³ãŒã«ã¢ãŠãã®ããã¿ãç解ãããããªããŸããåã³ãŒã«ã¢ãŠãèŠæ±ã¯ãHTTP ã¡ãœããããã³ãšã³ããã€ã³ãã«é¢é£ä»ããããŠããŸããHTTP ã¡ãœããã¯ãç®çã®ã¢ã¯ã·ã§ã³çš®å¥ã瀺ããŸãã
æãåçŽãªèŠæ±ã¯ GET èŠæ± (GET 㯠HTTP ã¡ãœãã) ã§ããGET èŠæ±ã¯ãéä¿¡è ããµãŒããŒã®ãªãœãŒã¹ã«é¢ããæ å ±ãååŸãããšãã«äœ¿çšããŸãããµãŒããŒã¯ãã®èŠæ±ãåä¿¡ããŠåŠçãããšãèŠæ±æ å ±ãåä¿¡è ã«è¿ããŸããGET èŠæ±ã¯ããã©ãŠã¶ãŒã§ç¹å®ã®ã¢ãã¬ã¹ã«ç§»åããããšã«äŒŒãŠããŸããWeb ããŒãžã«ã¢ã¯ã»ã¹ãããšããã©ãŠã¶ãŒã¯ããã¯ã°ã©ãŠã³ã㧠GET èŠæ±ãå®è¡ããŸãããã©ãŠã¶ãŒã§ã¯ããã®ç§»åã®çµæã¯è¡šç€ºãããæ°ãã HTML ããŒãžã«ãªããŸããã³ãŒã«ã¢ãŠãã§ã¯ããã®çµæã¯å¿çãªããžã§ã¯ãã«ãªããŸãã
GET èŠæ±ã®ããã¿ã説æããããããã©ãŠã¶ãŒãéã㊠https://th-apex-http-callout.herokuapp.com/animals ã® URI ã«ç§»åããŸãããµãŒãã¹ããå¿çã JSON 圢åŒã§è¿ããããããå¥åŠãªåœ¢åŒã®åç©ã®ãªã¹ãããã©ãŠã¶ãŒã«è¡šç€ºãããŸããGET å¿çã¯ãXML 圢åŒã®å ŽåããããŸãã
次ã«ãäžè¬ç㪠HTTP ã¡ãœããã«ã€ããŠèª¬æããŸãã
è¡š 1.äžè¬ç㪠HTTP ã¡ãœãã
HTTP ã¡ãœãã |
説æ |
---|---|
GET |
URL ã§èå¥ãããããŒã¿ãååŸããŸãã |
POST |
ãªãœãŒã¹ãäœæãããããµãŒããŒã«ããŒã¿ãæçš¿ãããããŸãã |
DELETE |
URL ã§èå¥ããããªãœãŒã¹ãåé€ããŸãã |
PUT |
ãªã¯ãšã¹ãããã£ã§éä¿¡ããããªãœãŒã¹ãäœæãŸãã¯çœ®æããŸãã |
æéãããã°ãããªãœãŒã¹ãã»ã¯ã·ã§ã³ã§ããã¹ãŠã® HTTP ã¡ãœããã®å®å šãªãªã¹ããåç §ããŠãã ããã
HTTP ã¡ãœããã®ã»ãã«ãåèŠæ±ã§ URI (ãµãŒãã¹ãååšãããšã³ããã€ã³ãã¢ãã¬ã¹) ãèšå®ããŸããããšãã°ããšã³ããã€ã³ã㯠http://www.example.com/api/resource ãšãªããŸãããHTTP ãšã³ãŒã«ã¢ãŠãã®åºæ¬ãåå ã®äŸã§ã¯ããšã³ããã€ã³ã㯠https://th-apex-http-callout.herokuapp.com/animals ã§ãã
ãµãŒããŒã¯èŠæ±ãåŠçãããšãå¿çã§ç¶æ³ã³ãŒããéä¿¡ããŸããç¶æ³ã³ãŒãã¯ãèŠæ±ãæ£åžžã«åŠçããããã©ããããŸãã¯ãšã©ãŒãçºçãããã©ããã瀺ããŸããèŠæ±ãæ£åžžã«åŠçããããšããµãŒããŒã¯ç¶æ³ã³ãŒã 200 ãéä¿¡ããŸããä»ã«ã 404 (ãã¡ã€ã«ãèŠã€ãããŸãã) ã 500 (å éšãµãŒããŒãšã©ãŒ) ãªã©ã®ç¶æ³ã³ãŒããèŠãããšããããããããŸããã
HTTP ã¡ãœããã®ãªã¹ããåç §ããåŸã§æéãããå Žåã¯ãããªãœãŒã¹ãã»ã¯ã·ã§ã³ã§ãã¹ãŠã®å¿çã®ç¶æ³ã³ãŒãã®ãªã¹ãã確èªããŠãã ãããå¯ä»ããªãå€ã«ã¯ããããã® 2 ã€ã®ãªãœãŒã¹ã圹ç«ã¡ãŸãã
ãµãŒãã¹ããã®ããŒã¿ã®ååŸ
HTTP ã®æ°ããç¥èã Apex ã³ãŒã«ã¢ãŠãã§æŽ»çšããŠã¿ãŸãããããã®äŸã§ã¯ãGET èŠæ±ã Web ãµãŒãã¹ã«éä¿¡ããŠã森ã«äœãåç©ã®ãªã¹ããååŸããŸãããµãŒãã¹ã¯ JSON 圢åŒã§å¿çãéä¿¡ããŸããJSON ã¯åºæ¬çã«æååã§ãããããçµã¿èŸŒã¿ã® JSONParser
ã¯ã©ã¹ã§ãªããžã§ã¯ãã«å€æããŸãããã®åŸããã®ãªããžã§ã¯ãã䜿çšããŠååç©ã®ååããããã°ãã°ã«æžã蟌ãããšãã§ããŸãã
ãã®åå ã®äŸãå®è¡ããåã«ãããšã³ããã€ã³ãã¢ãã¬ã¹ã®æ¿èªãã»ã¯ã·ã§ã³ã®æé ã䜿çšããŠãã³ãŒã«ã¢ãŠãã®ãšã³ããã€ã³ã URL (https://th-apex-http-callout.herokuapp.com) ãæ¿èªããå¿ èŠããããŸãã
- [Setup (èšå®)] () ãã [Developer Console (éçºè
ã³ã³ãœãŒã«)] ãéããŸãã
- éçºè
ã³ã³ãœãŒã«ã§ã[Debug (ãããã°)] | [Open Execute Anonymous Window (å®è¡å¿åãŠã£ã³ããŠãéã)] ãéžæããŸãã
- æ¢åã®ã³ãŒããåé€ãã次ã®ã¹ãããããæ¿å
¥ããŸãã
Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals'); request.setMethod('GET'); HttpResponse response = http.send(request); // If the request is successful, parse the JSON response. if(response.getStatusCode() == 200) { // Deserialize the JSON string into collections of primitive data types. Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); // Cast the values in the 'animals' key as a list List<Object> animals = (List<Object>) results.get('animals'); System.debug('Received the following animals:'); for(Object animal: animals) { System.debug(animal); } }
-
[Open Log (ãã°ãéã)] ãéžæãã[Execute (å®è¡)] ãã¯ãªãã¯ããŸãã
- ãããã°ãã°ãéãããã[Debug Only (ãããã°ã®ã¿)] ãéžæã㊠System.debug ã¹ããŒãã¡ã³ãã®åºåã衚瀺ããŸãã
åç©ã®ååã衚瀺ãããŸãã
ãã®äŸã® JSON ã¯éåžžã«åçŽã§è§£æãç°¡åã§ããããè€é㪠JSON æ§é ã«ã¯ãJSON2Apex ããŒã«ã䜿çšã§ããŸããJSON ã«è²Œãä»ããã ãã§ãããŒã«ã«ãã£ãŠå¿ èŠãª Apex ã³ãŒããçæãããŸããããããããŒã«ã§ã¯ãJSON æ§é ã解æããããã«åŒ·ãåä»ãããã Apex ã³ãŒããçæãããŸããçŽ æŽãããã§ãã!
ãµãŒãã¹ãžã®ããŒã¿ã®éä¿¡
HTTP ã³ãŒã«ã¢ãŠãã®ããäžã€ã®äžè¬çãªçšéã¯ããµãŒãã¹ã«ããŒã¿ãéä¿¡ããããšã§ããããšãã°ãJustin Bieber ã®ææ°ã¢ã«ãã ãè³Œå ¥ããå Žåãããæ°ã«å ¥ãã®åç»ãCat in a Shark Costume Chases a Duck While Riding a Roombaãã«ã³ã¡ã³ãããå Žåããã©ãŠã¶ãŒã¯ POST èŠæ±ãå®è¡ããŠããŒã¿ãéä¿¡ããŸããã§ã¯ãApex ã§ããŒã¿ãéä¿¡ããæ¹æ³ãèŠãŠãããŸãããã
ãã®äŸã§ã¯ãPOST èŠæ±ã Web ãµãŒãã¹ã«éä¿¡ããŠåç©ã®ååãè¿œå ããŸããæ°ããååã JSON æååãšããŠãªã¯ãšã¹ãããã£ã«è¿œå ãããŸããèŠæ±ã® Content-Type
ããããŒãèšå®ãããŠããã®ã§ããµãŒãã¹ã¯éä¿¡ããŒã¿ã JSON 圢åŒã§ããããšãèªèããŠããŒã¿ãé©åã«åŠçã§ããŸãããµãŒãã¹ã¯ãç¶æ³ã³ãŒããšãã¹ãŠã®åç©ã®ãªã¹ã (è¿œå ããåç©ãå«ã) ãéä¿¡ããŠå¿çããŸããèŠæ±ãæ£åžžã«åŠçããããšããªãœãŒã¹ãäœæãããç¶æ³ã³ãŒã 201 ãè¿ãããŸãã201 以å€ãè¿ããããšãå¿çã¯ãããã°ãã°ã«éä¿¡ãããŸãã
- [Setup (èšå®)] () ãã [Developer Console (éçºè
ã³ã³ãœãŒã«)] ãéããŸãã
- éçºè
ã³ã³ãœãŒã«ã§ã[Debug (ãããã°)] | [Open Execute Anonymous Window (å®è¡å¿åãŠã£ã³ããŠãéã)] ãéžæããŸãã
- æ¢åã®ã³ãŒããåé€ãã次ã®ã¹ãããããæ¿å
¥ããŸãã
Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals'); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json;charset=UTF-8'); // Set the body as a JSON object request.setBody('{"name":"mighty moose"}'); HttpResponse response = http.send(request); // Parse the JSON response if(response.getStatusCode() != 201) { System.debug('The status code returned was not expected: ' + response.getStatusCode() + ' ' + response.getStatus()); } else { System.debug(response.getBody()); }
-
[Open Log (ãã°ãéã)] ãéžæãã[Execute (å®è¡)] ãã¯ãªãã¯ããŸãã
- ãããã°ãã°ãéãããã[Debug Only (ãããã°ã®ã¿)] ãéžæãã
System.debug
ã¹ããŒãã¡ã³ãã®åºåã衚瀺ããŸããåç©ã®ãªã¹ãã®æåŸã®é ç®ã¯ã"mighty moose" ã§ãã
ã³ãŒã«ã¢ãŠãã®ãã¹ã
ã³ãŒã«ã¢ãŠãã®ãã¹ãã«ã€ããŠã¯ãè¯ããã¥ãŒã¹ãšæªããã¥ãŒã¹ããããŸããæªããã¥ãŒã¹ã¯ãApex ãã¹ãã¡ãœããã¯ã³ãŒã«ã¢ãŠãããµããŒãããŠããªããããã³ãŒã«ã¢ãŠããå®è¡ãããã¹ãã¯å€±æãããšããããšã§ããè¯ããã¥ãŒã¹ã¯ãã©ã³ã¿ã€ã ã®ãã¹ãã§ãç䌌ãã³ãŒã«ã¢ãŠããå®è¡ã§ããããšã§ããç䌌ã³ãŒã«ã¢ãŠãã§ã¯ãå®éã« Web ãµãŒãã¹ãã³ãŒã«ããã«ããã¹ãã§è¿ãããå¿çãæå®ã§ããŸããèŠããã«ãããã® Web ãµãŒãã¹ããè¿ãããå 容ã¯ããã£ãŠããã®ã§ããã¹ãäžã« Web ãµãŒãã¹ãã³ãŒã«ãã代ããã«ãã®ããŒã¿ãè¿ããŠã»ããããšã©ã³ã¿ã€ã ã«äŒããŸãããã¹ãã§ç䌌ã³ãŒã«ã¢ãŠãã䜿çšãããšãååãªã³ãŒãã«ããŒçãéæã§ããã³ãŒã«ã¢ãŠãã«ããã³ãŒãè¡ã®ã¹ããããåé¿ã§ããŸãã
åææ¡ä»¶
ãã¹ããäœæããåã«ãããµãŒãã¹ãžã®ããŒã¿ã®éä¿¡ãåå ã§å¿åã§å®è¡ãã GET èŠæ±ãš POST èŠæ±ã®äŸãå«ãŸããã¯ã©ã¹ãäœæããŸãããããããã®äŸã¯ãèŠæ±ãã¡ãœããå ã«é 眮ãããŠå€ãè¿ãããã«è¥å¹²å€æŽãããŠããŸãããåºæ¬çã«åã®äŸãšåãã§ãã
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Class (Apex ã¯ã©ã¹)] ãéžæããŸãã
- ã¯ã©ã¹åã«
AnimalsCallouts
ãšå ¥åãã[OK] ãã¯ãªãã¯ããŸãã
- èªåçæãããã³ãŒãã次ã®ã¯ã©ã¹å®çŸ©ã§çœ®ãæããŸãã
public class AnimalsCallouts { public static HttpResponse makeGetCallout() { Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals'); request.setMethod('GET'); HttpResponse response = http.send(request); // If the request is successful, parse the JSON response. if(response.getStatusCode() == 200) { // Deserializes the JSON string into collections of primitive data types. Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); // Cast the values in the 'animals' key as a list List<Object> animals = (List<Object>) results.get('animals'); System.debug('Received the following animals:'); for(Object animal: animals) { System.debug(animal); } } return response; } public static HttpResponse makePostCallout() { Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals'); request.setMethod('POST'); request.setHeader('Content-Type', 'application/json;charset=UTF-8'); request.setBody('{"name":"mighty moose"}'); HttpResponse response = http.send(request); // Parse the JSON response if(response.getStatusCode() != 201) { System.debug('The status code returned was not expected: ' + response.getStatusCode() + ' ' + response.getStatus()); } else { System.debug(response.getBody()); } return response; } }
-
CTRL+S ããŒãæŒããŠä¿åããŸãã
StaticResourceCalloutMock ã䜿çšããã³ãŒã«ã¢ãŠãã®ãã¹ã
ã³ãŒã«ã¢ãŠãããã¹ãããã«ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããããéçãªãœãŒã¹ã䜿çšããŠç䌌ã³ãŒã«ã¢ãŠãã䜿çšããŸãããã®äŸã§ã¯ããŸãéçãªãœãŒã¹ã䜿çšããåŸã§ç䌌ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŸããéçãªãœãŒã¹ã«ã¯ãè¿ãã¬ã¹ãã³ã¹ããã£ãå«ãŸããŸããç¹°ãè¿ãã«ãªããŸãããç䌌ã³ãŒã«ã¢ãŠãã䜿çšããå ŽåãèŠæ±ã¯ãšã³ããã€ã³ãã«éä¿¡ãããŸããã代ããã«ãApex ã©ã³ã¿ã€ã ããéçãªãœãŒã¹ã§æå®ãããå¿çãæ€çŽ¢ããŠè¿ãããšãèªèããŠããŸããTest.setMock
ã¡ãœããã¯ãç䌌ã³ãŒã«ã¢ãŠãããã¹ãã¡ãœããã§äœ¿çšãããŠããããšãã©ã³ã¿ã€ã ã«éç¥ããŸããå®éã®ç䌌ã³ãŒã«ã¢ãŠãã®åäœãèŠãŠã¿ãŸãããããŸããGET èŠæ±ã§äœ¿çšãã JSON 圢åŒã®æååãå«ãŸããéçãªãœãŒã¹ãäœæããŸãã
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Static Resource (éçãªãœãŒã¹)] ãéžæããŸãã
- ååã«
GetAnimalResource
ãšå ¥åããŸãã
- JSON ã䜿çšããŠããŸãããMIME ã¿ã€ãã« [text/plain] ãéžæããŸãã
-
[Submit (éä¿¡)] ãã¯ãªãã¯ããŸãã
- ãªãœãŒã¹ã®éããã¿ãã§ã次ã®ã³ã³ãã³ããæ¿å
¥ããŸãã次ã«ãç䌌ã³ãŒã«ã¢ãŠãã§è¿ãããå
容ã瀺ããŸããããã¯æ£®ã«äœã 3 çš®é¡ã®åç©ã®é
åã§ãã
{"animals":["pesky porcupine", "hungry hippo", "squeaky squirrel"]}
[ãã¹ãŠã 1 è¡ã«åãŸã£ãŠããŠãæ¹è¡ãããŠããªãããšã確èªããŸãã]
-
CTRL+S ããŒãæŒããŠä¿åããŸãã
éçãªãœãŒã¹ãæ£åžžã«äœæãããŸããã次ã¯ããã®ãªãœãŒã¹ã䜿çšããã³ãŒã«ã¢ãŠãã®ãã¹ããè¿œå ããŸãããã
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Class (Apex ã¯ã©ã¹)] ãéžæããŸãã
- ã¯ã©ã¹åã«
AnimalsCalloutsTest
ãšå ¥åãã[OK] ãã¯ãªãã¯ããŸãã
- èªåçæãããã³ãŒãã次ã®ãã¹ãã¯ã©ã¹å®çŸ©ã§çœ®ãæããŸãã
@isTest private class AnimalsCalloutsTest { @isTest static void testGetCallout() { // Create the mock response based on a static resource StaticResourceCalloutMock mock = new StaticResourceCalloutMock(); mock.setStaticResource('GetAnimalResource'); mock.setStatusCode(200); mock.setHeader('Content-Type', 'application/json;charset=UTF-8'); // Associate the callout with a mock response Test.setMock(HttpCalloutMock.class, mock); // Call method to test HttpResponse result = AnimalsCallouts.makeGetCallout(); // Verify mock response is not null Assert.areNotEqual(null,result, 'The callout returned a null response.'); // Verify status code Assert.areEqual(200,result.getStatusCode(), 'The status code is not 200.'); // Verify content type Assert.areEqual('application/json;charset=UTF-8', result.getHeader('Content-Type'), 'The content type value is not expected.'); // Verify the array contains 3 items Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(result.getBody()); List<Object> animals = (List<Object>) results.get('animals'); Assert.areEqual(3, animals.size(), 'The array should only contain 3 items.'); } }
-
CTRL+S ããŒãæŒããŠä¿åããŸãã
-
[Test (ãã¹ã)] | [Always Run Asynchronously (åžžã«éåæã«å®è¡)] ãéžæããŸãã
[Always Run Asynchronously (åžžã«éåæã«å®è¡)] ãéžæãããŠããªãå Žåã¯ã1 ã€ã®ã¯ã©ã¹ã®ã¿ãå«ãŸãããã¹ãå®è¡ãåæããŠå®è¡ãããŸããéåæãã¹ãå®è¡ã®å Žåã«ã®ã¿ [Tests (ãã¹ã)] ã¿ããããã°ãéãããšãã§ããŸãã
- ãã¹ããå®è¡ããã«ã¯ã[Test (ãã¹ã)] | [New Run (æ°èŠå®è¡)] ãéžæããŸãã
- [Test Classes (ãã¹ãã¯ã©ã¹)] ãªã¹ãããã[AnimalsCalloutsTest] ãéžæããŸãã
-
[Add Selected (éžæãããé
ç®ãè¿œå )] | [Run (å®è¡)] ãã¯ãªãã¯ããŸãã
[Tests (ãã¹ã)] ã¿ãã®ãã¹ãå®è¡ ID ã®äžã«ãã¹ãçµæã衚瀺ãããŸãããã¹ãå®è¡ãå®äºãããããã¹ãå®è¡ãå±éããŠã詳现ã衚瀺ããŸãã次ã«ã[Overall Code Coverage (å šäœã®ã³ãŒãã«ããŒç)] ãã€ã³ã§ [AnimalCallouts] ãããã«ã¯ãªãã¯ããŠããã¹ãã§ã«ããŒãããè¡ã確èªããŸãã
HttpCalloutMock ã䜿çšããã³ãŒã«ã¢ãŠãã®ãã¹ã
POST ã³ãŒã«ã¢ãŠãã®ãã¹ãã®ããã«ãHttpCalloutMock
ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
ãçšæãããŠããŸãããã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãrespond
ã¡ãœããã§éä¿¡ãããå¿çãæå®ã§ããŸãããã¹ãã¯ã©ã¹ã¯ãTest.setMock
ãå床ã³ãŒã«ããŠãã®ç䌌å¿çãéä¿¡ããããã« Apex ã©ã³ã¿ã€ã ã«æ瀺ããŸãã第 1 åŒæ°ã§ãHttpCalloutMock.class
ãæž¡ããŸãã第 2 åŒæ°ã§ã¯ãHttpCalloutMock
ã®ã€ã³ã¿ãŒãã§ãŒã¹å®è£
ã§ãã AnimalsHttpCalloutMock
ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãæž¡ããŸãããã®äŸã® AnimalsHttpCalloutMock
ã¯ããã®åŸã«äœæããŸãã
Test.setMock(HttpCalloutMock.class, new AnimalsHttpCalloutMock());
次ã«ãHttpCalloutMock
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ãè¿œå ããŠãã³ãŒã«ã¢ãŠããææããŸããHTTP ã³ãŒã«ã¢ãŠãããã¹ãã³ã³ããã¹ãã§åŒã³åºãããå Žåãã³ãŒã«ã¢ãŠãã¯å®è¡ãããŸããã代ããã«ãAnimalsHttpCalloutMock
ã® respond
ã¡ãœããå®è£
ã§æå®ããç䌌å¿çãåä¿¡ãããŸãã
- éçºè
ã³ã³ãœãŒã«ã§ã[File (ãã¡ã€ã«)] | [New (æ°èŠ)] | [Apex Class (Apex ã¯ã©ã¹)] ãéžæããŸãã
- ã¯ã©ã¹åã«
AnimalsHttpCalloutMock
ãšå ¥åãã[OK] ãã¯ãªãã¯ããŸãã
- èªåçæãããã³ãŒãã次ã®ã¯ã©ã¹å®çŸ©ã§çœ®ãæããŸãã
@isTest global class AnimalsHttpCalloutMock 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('{"animals": ["majestic badger", "fluffy bunny", "scary bear", "chicken", "mighty moose"]}'); response.setStatusCode(200); return response; } }
-
CTRL+S ããŒãæŒããŠä¿åããŸãã
次ã®äŸã®ããã«ããã¹ãã¯ã©ã¹ã§ testPostCallout
ã¡ãœãããäœæããŠç䌌ã³ãŒã«ã¢ãŠããèšå®ããŸããtestPostCallout
ã¡ãœãã㯠Test.setMock
ãã³ãŒã«ããŠãã AnimalsCallouts
ã¯ã©ã¹ã® makePostCallout
ã¡ãœãããã³ãŒã«ããŸãã次ã«ãè¿ãããå¿çããç䌌å®è£
ã®å¿ç
ã¡ãœããã§æå®ããå
容ã§ããããšã確èªããŸãã
- ãã¹ãã¯ã©ã¹
AnimalsCalloutsTest
ãå€æŽãã2 çªç®ã®ãã¹ãã¡ãœãããè¿œå ããŸãã
- ã¯ã©ã¹ã¿ããã¯ãªãã¯ããéãæ¬åŒ§ã®åã«æ¬¡ã®ã¡ãœãããè¿œå ããŸãã
@isTest static void testPostCallout() { // Set mock callout class Test.setMock(HttpCalloutMock.class, new AnimalsHttpCalloutMock()); // This causes a fake response to be sent // from the class that implements HttpCalloutMock. HttpResponse response = AnimalsCallouts.makePostCallout(); // Verify that the response received contains fake values String contentType = response.getHeader('Content-Type'); Assert.isTrue(contentType == 'application/json'); String actualValue = response.getBody(); System.debug(response.getBody()); String expectedValue = '{"animals": ["majestic badger", "fluffy bunny", "scary bear", "chicken", "mighty moose"]}'; Assert.areEqual(expectedValue, actualValue); Assert.areEqual(200, response.getStatusCode()); }
-
CTRL+S ããŒãæŒããŠä¿åããŸãã
-
[Test (ãã¹ã)] | [New Run (æ°èŠå®è¡)] ãéžæããŸãã
- [Test Classes (ãã¹ãã¯ã©ã¹)] ãªã¹ãããã[AnimalsCalloutsTest] ãéžæããŸãã
-
[Add Selected (éžæãããé
ç®ãè¿œå )] | [Run (å®è¡)] ãã¯ãªãã¯ããŸãã
[Tests (ãã¹ã)] ã¿ãã®æ°ãããã¹ãå®è¡ ID ã®äžã«ãã¹ãçµæã衚瀺ãããŸãããã¹ãå®è¡ãå®äºãããããã¹ãå®è¡ãå±éããŠãäž¡æ¹ã®ãã¹ãã«é¢ãã詳现ã衚瀺ããŸãã
ããã²ãšããš...
ããªã¬ãŒããã³éåæ Apex ã§ã®ã³ãŒã«ã¢ãŠãã®äœ¿çšãšãéåæã³ãŒã«ã¢ãŠãã®å®è¡ã«ã€ããŠèª¬æããŸãã
ã¡ãœããããã³ãŒã«ã¢ãŠããå®è¡ããå Žåãã¡ãœããã¯åŸç¶ã®ã³ãŒãè¡ãå®è¡ããåã«å€éšãµãŒãã¹ããã³ãŒã«ã¢ãŠãå¿çãéãè¿ããããŸã§åŸ
æ©ããŸãããŸãã¯ã@future(callout=true)
ã¢ãããŒã·ã§ã³ãä»å ãããéåæã¡ãœããã«ã³ãŒã«ã¢ãŠãã³ãŒããé
眮ããããQueueable Apex ã䜿çšãããã§ããŸããããã«ãããã³ãŒã«ã¢ãŠããåå¥ã®ã¹ã¬ããã§å®è¡ãããã³ãŒã«å
ã¡ãœããã®å®è¡ããããã¯ãããªããªããŸãã
ããªã¬ãŒããã³ãŒã«ã¢ãŠããå®è¡ãããšãã¯ãå¿çã®åŸ
æ©äžã«ã³ãŒã«ã¢ãŠãã«ãã£ãŠããªã¬ãŒããã»ã¹ããããã¯ãããªãããã«ããå¿
èŠããããŸããããªã¬ãŒã§ã³ãŒã«ã¢ãŠããå®è¡ã§ããããã«ããã«ã¯ãã³ãŒã«ã¢ãŠãã³ãŒããå«ãŸããã¡ãœããã« @future(callout=true)
ã¢ãããŒã·ã§ã³ãä»å ããŠãåå¥ã®ã¹ã¬ããã§å®è¡ããå¿
èŠããããŸãã
ãªãœãŒã¹
- MDN Web Docs: HTTP request methods (HTTP èŠæ±ã¡ãœãã)
- MDN Web Docs: HTTP response status codes (HTTP å¿çç¶æ³ã³ãŒã)
- Apex éçºè ã¬ã€ã: Apex ã䜿çšããã³ãŒã«ã¢ãŠãã®åŒã³åºã
- ãŠã£ãããã£ã¢: Representational state transfer (REST)
- W3C Note: Simple Object Access Protocol (SOAP) 1.1