Tuesday, August 18, 2015

Bulk Data load integration across two different organizations

I tried the code which was posted in salesforce blogs
https://developer.salesforce.com/blogs/developer-relations/2015/07/using-apex-to-integrate-salesforce.html
I made some minor changes to trigger and the class to bulk load data between two different organizations.

Create Trigger on account object.
trigger SendAccount on Account(after insert)
{
 String jsonstr = JSON.serializePretty(Trigger.new);
 SendAccountUsingRESTAPI.callcreateAcc(jsonstr);
}

SendAccountUsingRESTAPI Apex Class

public class SendAccountUsingRESTAPI {
  private final String clientId = 'Client Id From Connected App';
   private final String clientSecret = 'clientSecret From Connected App';
   private final String username = 'User Name';
   private final String password = 'Password';
  public class deserializeResponse
   {
      public String id;
      public String access_token;
   }
  public String ReturnAccessToken (SendAccountUsingRESTAPI acount)
   {
      String reqbody = 'grant_type=password&client_id='+clientId+'&client_secret='+clientSecret+'&username='+username+'&password='+password;
     Http h = new Http();
      HttpRequest req = new HttpRequest();
      req.setBody(reqbody);
      req.setMethod('POST');
      req.setEndpoint('https://login.salesforce.com/services/oauth2/token');
      HttpResponse res = h.send(req);
      System.debug('\n Body Response:'+res.getbody());
      deserializeResponse resp1 = (deserializeResponse)JSON.deserialize(res.getbody(),deserializeResponse.class);
      return resp1.access_token;
   }
   
   @future(callout=true)
   public static void callcreateAcc(String jsonstr)
   {
      SendAccountUsingRESTAPI acount1 = new SendAccountUsingRESTAPI();
      String accessToken;
      accessToken = acount1.ReturnAccessToken (acount1);

       if(accessToken != null){
          String endPoint = 'https://ap1.salesforce.com/services/apexrest/v1/sampledemo/';

           Http h2 = new Http();
           HttpRequest req1 = new HttpRequest();
           req1.setHeader('Authorization','Bearer ' + accessToken);
           req1.setHeader('Content-Type','application/json');
           req1.setHeader('accept','application/json');
           req1.setBody(jsonstr);
           req1.setMethod('POST');
           req1.setEndpoint(endPoint);
           HttpResponse res1 = h2.send(req1);
        
           String trimmedResponse = res1.getBody().unescapeCsv().remove('\\');
           
           List<Account> accountsDeserialized = (List<Account>) JSON.deserialize(trimmedResponse, List<Account>.class);
           List<Account> lstAccount=new List<Account>();
           for(Account acc:accountsDeserialized){
               Account ac=new Account(Id=acc.Customer_ID__c);
               ac.Customer_ID__c=acc.Id;
               lstAccount.add(ac);
           }
           
           if(!lstAccount.isEmpty()){
               update lstAccount;
           }
        }
   }
}
In the Other Salesforce Org we need to created a rest web service. I create a sampledemo class
@RestResource(urlMapping='/v1/sampledemo/*')
global with sharing class sampledemo {

    @HttpPost
    global static String createAccount(){
        String requestBody = RestContext.request.requestBody.toString();
       // List<Account> accountsDeserialized = (List<Account>) JSON.deserialize(requestBody, List<Account>.class);
        //insert accountsDeserialized;
        List<Account> accountsDeserialized=new List<Account>();
        List<Object> m = (List<Object>)JSON.deserializeUntyped(requestBody);
        for(Object obj:m){
            Map<String,Object> requests = (Map<String,Object>)obj;
            Account acc=new Account();
            acc.Name=(String)requests.get('Name');
            acc.Customer_Id__c=(Id)requests.get('Id');
            accountsDeserialized.add(acc);
        }
        
        if(!accountsDeserialized.isEmpty()){
            insert accountsDeserialized;
        }
  
        String returnResponse = JSON.serialize(accountsDeserialized);
        return returnResponse;
    }
}
I tried the below code to load 3 accounts. It made 2 callouts(one for authentication and the other for data sync).
List<Account> lstAccount=new List<Account>();
for(Integer i=0;i<3;i++){
 Account acc=new Account();
 acc.Name= 'Test Sample'+i;
 lstAccount.add(acc);
}
insert lstAccount;
The response we get from the External org will be in JSON format. The response we are parsing and updating the customer id field.

No comments:

Post a Comment