+ Start a Discussion
Rajani KalleRajani Kalle 

Apex Specialist Super badge Challenge2: Synchronize Salesforce data with an external system using asynchronous REST callouts, Can anyone explain the steps to implement logic?

What are the basic steps to implement ? when do we need JSON?I know many of you posted code , but please explain me the steps in sequence  in order to implement logic.
Rajani KalleRajani Kalle
Thank you Nagendra, Apex specialist Challenge 1 has got success by above code and the detailed steps helped me alot .
Can you please provide those kind steps to resolve  challenge2 : Synchronize Salesforce data with an external system.
Thanks again,
Hi Rajani,
Please follow these steps for Apex Specialist Challenge 2 - Synchronize Salesforce data with an external system

First create In Quick Box -> Setting -> Remote Site  -> New
Remote Site Name : th_superbadge
Remote Site URL : https://th-superbadge-apex.herokuapp.com
 Developer Console :  WarehouseCalloutService .apxc:

public with sharing class WarehouseCalloutService {
    private static final String WAREHOUSE_URL = 'https://th-superbadge-apex.herokuapp.com/equipment';
    public static void runWarehouseEquipmentSync() {
        //ToDo: complete this method to make the callout (using @future) to the
        //      REST endpoint and update equipment on hand.
        HttpResponse response = getResponse(); 
        if(response.getStatusCode() == 200)
            List<Product2> results = getProductList(response); //get list of products from Http callout response
            if(results.size() >0)
            upsert results Warehouse_SKU__c; //Upsert the products in your org based on the external ID SKU
        //Get the product list from the external link
        public static List<Product2> getProductList(HttpResponse response)
            List<Object> externalProducts = (List<Object>) JSON.deserializeUntyped(response.getBody()); //desrialize the json response
            List<Product2> newProducts = new List<Product2>();
            for(Object p : externalProducts)
                Map<String, Object> productMap = (Map<String, Object>) p;
                Product2 pr = new Product2();
                //Map the fields in the response to the appropriate fields in the Equipment object
                pr.Replacement_Part__c = (Boolean)productMap.get('replacement');
                pr.Cost__c = (Integer)productMap.get('cost');
                pr.Current_Inventory__c = (Integer)productMap.get('quantity');
                pr.Lifespan_Months__c = (Integer)productMap.get('lifespan') ;
                pr.Maintenance_Cycle__c = (Integer)productMap.get('maintenanceperiod');
                pr.Warehouse_SKU__c = (String)productMap.get('sku');
                pr.ProductCode = (String)productMap.get('_id');
                pr.Name = (String)productMap.get('name');
            return newProducts;
        // Send Http GET request and receive Http response
    public static HttpResponse getResponse() {
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        HttpResponse response = http.send(request);
        return response;


private class WarehouseCalloutServiceTest {
  // implement your mock callout test here
    static void WarehouseEquipmentSync(){
        // Set mock callout class 
        Test.setMock(HttpCalloutMock.class, new WarehouseCalloutServiceMock()); 
        // This causes a fake response to be sent from the class that implements HttpCalloutMock. 
        System.assertEquals(1, [SELECT count() FROM Product2]);        

Open anonymous window and execute code once before check challenge:

Urvashi BabbarUrvashi Babbar
After being stuck on this challenge for so long I finally got my solution:

Please check answer at: 
Akansha Singh 28Akansha Singh 28
Hi everyone,
Use  -----------  System.enqueueJob(New WarehouseCalloutService()); in Anonymous Window instead WarehouseCalloutService.runWarehouseEquipmentSync();