Tuesday, 25 December 2012

JSON to Apex Convesion simpler now with http://json2apex.herokuapp.com

With the REST API being lot used when integrating apps developed on force.com paltform with the mobile applications or integrating force.com with external applications communicating using JSON it becomes vital to know few of open source tool we have to make our task simpler.

When we are in technology consulting world the time becomes crucial in any project we face .

There are couple of tools that i normally use whenever an integration is using REST API and the format of data communication is in the form of JSON .

In this blog i will describe two commonly used applications that makes life simpler when dealing with the JSON data.


This application is very useful to format and Validate the JSON .All you need to do is input the JSON in the text box provided and click on Validate button to Validate the JSON .

JSON Lint is a web based validator and reformatter for JSON, a lightweight data-interchange format.


This was recently developed by salesforce evangelism (SuperFell and PattPatterson) and this is really helpful .The app is on the Heroku paltform and its really helpful of you want to construct an apex class from the JSON you have .

All you need is validated JSON (validate using jsonlint.com) is inputed and just a button click will give you the generated class and also the deserialiser method .

Lets see an example 

Say i have the JSON data as shown below 
{

    "id": "https://login.salesforce.com/id/00D90000000aRkLEAU/00590000000HI32AAG",

    "issued_at": "1355574766264",

    "instance_url": "https://ap1.salesforce.com",

    "signature": "LfOtSilg0GXb8NMO2YwcFvDTjRf8Ml0+jxI3XOozmuw=",

    "access_token": "00D90000000aRkL!ARIAQLLtJXpuyCteMrXEbkbEi6qZcgUhkeaK6_.Yqrxlz8JeOn"

}

Once i input this JSON into the app i get the following result
//
// Generated by JSON2Apex http://json2apex.herokuapp.com/
//

public class JSON2Apex {

 public String id;
 public String issued_at;
 public String instance_url;
 public String signature;
 public String access_token;

 
 public static JSON2Apex parse(String json) {
  return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
 }
 
 static testMethod void testParse() {
  String json = '{'+
  ''+
  '    \"id\": \"https://login.salesforce.com/id/00D90000000aRkLEAU/00590000000HI32AAG\",'+
  ''+
  '    \"issued_at\": \"1355574766264\",'+
  ''+
  '    \"instance_url\": \"https://ap1.salesforce.com\",'+
  ''+
  '    \"signature\": \"LfOtSilg0GXb8NMO2YwcFvDTjRf8Ml0+jxI3XOozmuw=\",'+
  ''+
  '    \"access_token\": \"00D90000000aRkL!ARIAQLLtJXpuyCteMrXEbkbEi6qZcgUhkeaK6_.Yqrxlz8JeOn\"'+
  ''+
  '}';
  JSON2Apex obj = parse(json);
  System.assert(obj != null);
 }
}
This is really awesome .No more time consumed to draft the apex class Happy Coding!

Sunday, 23 December 2012

Handling PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException exception in SFDC Callout

Recently i encountered an exception during making a Callout to the external service .Being an apex developer and unfamiliar with SSL concept much with no luck after googling i tried posting the question in stackexchange Stackexchange link.I am thankful to the Martin Peters for helping me on this .

Through this blog post i would like to document few points i learned on cause of this exception and also i will indicate the solution and resources we have that can help us to get rid of this exception

1)First way to identify this exception is if we try to open the URL we are using to  make a callout to external system in any browser we will encounter the security exception.The below image shows how our browser will behave once encountering such SSL exception.


2)This happens when the external system we make callout from the salesforce does not have valid SSL certificate 

For the JAVA client we have solution on the discussion board .http://boards.developerforce.com/t5/General-Development/PKIX-path-building-failed/td-p/128332

There are two very popular way of implementing authenticated Callouts 

1)one-way SSL/certificate security
2)Two-way SSL 

1)One-Way SSL is easiest implementation :

This blog explains the process for cast iron and i must thank the author of blogger post for such wonderful explanation

So if the external server implements this the problem gets solved straight away.

2)Two-way SSL :
Thanks to the developer.force.com of salesforce that we have an excellent article on how to configure this on salesforce end 

We have a list of SSL certifcates that are accepted by salesforce and verified .Here is the link to the document

Saturday, 15 December 2012

Oauth 2.0 Salesforce Using REST Console of Chrome Browser


Earlier in one of my blog post i had demonstrated on how to use Mozilla Poster tool to verify the REST API calls of the salesforce.

Using Chrome REST console has several advantages than poster mozilla .The response can be seen in both JSON and XML and also the concept of oauth 2.0 also can be practically understood .

There are very good articles on 2.0 on the developer.force.com and here is the link Digging deeper into Oauth 2.0

The workbench.developerforce.com has an excellent REST utility which helps in quick verification of Restful Apex services or even standard REST API exposed by the salesforce .One major disadvantage of this is since the oauth happens automatically the conceptual knowledge on how oauth 2.0 works is hidden .

In this blog post we will use the REST Console of the chrome and first get the oauth token from the salesforce instance and then will invoke the REST service from the salesforce .

Step 1-Getting oauth token from salesforce instance 

First step is to set up the remote access settings so that we can obtain the Client secret as well as the clientId

Click On image to View on ful

Step-2-Using the POST call to access the Oauth token from the salesforce 

The payload will be in XML and here is the format of the payload

grant_type=password&client_id=<your_client_id>&client_secret=<your_client_secret>&username=<your_username>&password=<your_password>

where client id,client secret you will get from your remote access settings and please append security token if you are making from unautorized IP range .Please use appropriate User Name and Password

The target URL to obtain token from the salesforce is as follows 



Use this first as a request URL to get access token .Please use test.salesforce.com for sandbox







Step-3:Making a POST request will yield the JSON with token and here is the snapshot of the issued token from salesforce 












JSON Response Obtained From Server:

{
    "id": "https://login.salesforce.com/id/00D90000000aRkLEAU/00590000000HI32AAG",
    "issued_at": "1355574766264",
    "instance_url": "https://ap1.salesforce.com",
    "signature": "LfOtSilg0GXb8NMO2YwcFvDTjRf8Ml0+jxI3XOozmuw=",
    "access_token": "00D90000000aRkL!ARIAQLLtJXpuyCteMrXEbkbEi6qZcgUhkeaK6_.Yqrxlz8JeOn"
}
The access_token parameter contains the access token can be used in header to access the services

Step 4-The access token is used along with bearer word in the authorisation header to access any rest service.the snapshot shows where the access token needs to be entered in REST console

Click on image to View Full Screen


The response obtained can be changed to XML or JSON using the REST console.
Click on image to View Full Screen





Sunday, 2 December 2012

Writing Test Classes For Apex Rest Service

I came across a question in a developer community on how to write Unit Test Classes for the Rest API service for POST HTTP calls

Unit Test Classes for REST API following link is very useful and inspired by this jeff had an article on his blog on how to write the test method for same .

Here is the Jeff Blog Link Test Class for REST API(Good reference for GET Rest Services)


In one of my previous blog post i demonstrated how to use native parsing technique for Rest api for User Defined Type
I wrote the Test class for the same and this post is helpful for all those searching for how to write test classes for apex rest service annotated with POST Call
Here is the Rest Service Class for which i attempted the test class
@RestResource(urlMapping='/DemoUrl/*')
global with sharing class MyRestResourcedemo {

    global class RequestWrapper{
       public  Account acct;
        public Contact[] cons;
    }
  
   global class ResponseWrapper {           
        public String StatusCode;
        public String StatusMessage;
        public Account acct;
        public Contact[] cons;    
    }

@HttpPost
    global static ResponseWrapper doPost(RequestWrapper reqst) {
    
        ResponseWrapper resp = new ResponseWrapper();     
        try{
        insert reqst.acct;
        for(Contact c:reqst.cons){
        c.AccountId = reqst.acct.Id;
        }
        Upsert reqst.cons;
        }
        catch( Exception e ) {
                resp.statusCode = 'Error';
                resp.statusMessage = 'Exception : ' + e.getMessage();
           }
            resp.statusCode = 'Done';
            resp.statusMessage = 'Test success message';
            resp.acct = reqst.acct;
            resp.cons = reqst.cons;

        return resp;
    }
  }

Here is how i wrote my Test class and it ensured my class is covered and i aserted the response
@istest
public class SFA_TestRestPostService {
 
   static testMethod void  testPostRestService(){
   
   Account acc=new Account();
   acc.name='Test';
   acc.AccountNumber='1232332';
   acc.Site='site';
   acc.Website='cloudyworlds.blogspot.in';
   
   List lstcon=new List();

   integer i;
   for(i=0;i<=10;i++){
   Contact c=new Contact();
   c.lastname='Test+i';
   lstcon.add(c);
   }
   
   MyRestResourcedemo.RequestWrapper reqst=new MyRestResourcedemo.RequestWrapper();
   reqst.acct=acc;
   reqst.cons=lstcon;
   
   String JsonMsg=JSON.serialize(reqst);
   
   Test.startTest();
   
   //As Per Best Practice it is important to instantiate the Rest Context 
   
   RestRequest req = new RestRequest(); 
   RestResponse res = new RestResponse();
         
   req.requestURI = '/services/apexrest/DemoUrl';  //Request URL
   req.httpMethod = 'POST';//HTTP Request Type
   req.requestBody = Blob.valueof(JsonMsg);
   RestContext.request = req;
   RestContext.response= res;



   MyRestResourcedemo.ResponseWrapper resp =new  
   MyRestResourcedemo.ResponseWrapper(); 
   resp=MyRestResourcedemo.doPost(reqst); //Call the Method of the Class with Proper       Constructor 
   System.assert(resp.statusMessage.contains('Test success message'));//Assert the response has message as expected 
   System.assert(resp.statusCode.contains('Done'));
   System.assert(resp.acct.Id!=null);//Assert that the Account is inserted and has Id
   Test.stopTest();
   
   }
 }

Some thoughts on best practice can be found on this link of stackexchange

http://salesforce.stackexchange.com/questions/4988/writing-test-classes-for-apex-restservice

Friday, 23 November 2012

Sending Document as an attachment in the form of Pdf Using Workflow Rules of force.com platform and Visualforce Template feature


Emailing the pdf on click of a boolean check box or click of a button are frequent requirements for which we often think of using Triggers and using Outbound Emails of apex .

This requirement can be easily accomplished through workflow rules and the Visualforce Email Templates

In this blog POST will walk through on how to approach this

Step 1:
Creation of Email Field This is the first step to create an Email Field so that when we develop workflow rules when for the email alert the Recipient Type is asked we may fill in the email field
Step 2:
Creation of workflowThis is a simple step where based on business criteria draft a workflow rule.Usually rule should be to trigger the email alert only if the boolean flag is checked .
Step 3:Creation of email template The email Template will be a visualforce template and hence if you are familiar with visualforce this must be a straight forward impementation
Below is the sample code that you may customize by replacing with your relevant object name



   
   Please find your  receipt attached with this mail.
   


 


  
    



<!-- Section to insert header-

{!$Label.Header}

Label1 Label 2 Label 3

Image From Notes and Attachment


If have any image to display from documents then you will have to use the following
https://AAA.salesforce.com/servlet/servlet. ImageServer?id=BBB&oid=CCC AAA = your SFDC server, found in the URL of any SFDC link after you log in BBB = the record ID of your publicly available document CCC = your organization ID You can pull from documents.Dont pull from static Resource .It never works .
I answered couple of questions in stackexchange recently and this promoted me to write this blog post so that may help .

http://salesforce.stackexchange.com/questions/4637/is-it-possible-to-have-html-in-a-visual-force-email-template/4639#4639

http://salesforce.stackexchange.com/questions/4641/is-is-possible-to-display-an-image-or-icon-in-a-email-using-a-visualforce-templa/4643#4643

Sunday, 4 November 2012

Native Parsing Of JSON input into User Defined Class through Apex Rest Service

I have walked into Apex Guide of SFDC to find if there are code samples for the parsing of the JSON into User defined Class in apex.Unfortunately document mentions that this can be achieved but still there were no code snippets i could find.

This blog post might help for small snippet reference to understand how we can write an apex class and structure the Constructor of the POST annotated method to achieve native parsing automatically.
Here is the Code Snippet of the Class . Note that the Request is a combination of Account and Contacts and hence we may need an inner class .

@RestResource(urlMapping='/DemoUrl/*')
global with sharing class MyRestResourcedemo{

//User defined Class

global class RequestWrapper{
Account acct;
Contact[] cons;
}

//Response Wrapper Class
  
global class ResponseWrapper{           
public String StatusCode;
public String StatusMessage;
public Account acct;
public Contact[] cons;    
}

@HttpPost
global static ResponseWrapper doPost(RequestWrapper reqst){

ResponseWrapper resp = new ResponseWrapper();
     
try{
insert reqst.acct;
for(Contact c:reqst.cons){
c.AccountId = reqst.acct.Id;
}
Upsert reqst.cons;
}
catch( Exception e ){
resp.statusCode = 'Error';
resp.statusMessage = 'Exception : ' + e.getMessage();
}
resp.statusCode = 'Done';
resp.statusMessage = 'Test success message';
resp.acct = reqst.acct;
resp.cons = reqst.cons;
return resp;
}
}
The Request Body is as shown below
{
    "reqst" :
        {
            "acct" : { 
                        "Name" : "Test Account 1",
                       "AccountNumber" : "00000001",
                       "Site" : "Site1",
                       "Website" : "www.site1.com"
                       
                     },
        
            "cons":
                [
                    { "Name": "Test Contact1", "email" : "testcontact1@test.com", "LastName":"TLName2"},
                    { "Name": "Test Contact2", "email" : "testcontact2@test.com", "LastName":"TLName3"},
                    { "Name": "Test Contact3", "email" : "testcontact3@test.com", "LastName" : "TLName"}
                ]
        }
}

The Workbench has REST Utility that simplifies testing.Attached the snapshot.







Saturday, 20 October 2012

How to attach an image as an attachment to the parent object using REST API of force.com when image come from client as base64 encoded Text in JSON request

The REST API's offered by the force.com platform has matured lot since previous three versions and this makes it exiting for the integration with other system supporting JSON in their API's
I was reading an article by Sandeep Bhanot(I personally feel he is one of the best in salesforce evangelism) on the platform's ability to deserialise the base 64 encoded image and also decode it .
Here is the link to the article Using Binary Data With REST
Unfortunately my client app(ipad app)was using older version of REST kit that comes along with SDK and they feared upgrading to the newer version
Hence the design was altered to pass the base64 encoded text in the JSON request.Following is the code snippet that we need to decode the binary base 64 encoded image and attach as an attachment to the necessary parent object in sfdc
@RestResource(urlMapping='/Callmanagement/v1/*')
global with sharing class SFA_DoctorsignPoc {
    
@HttpPost
global static String attachdoctorsSign(String encodedSignature){
          
RestRequest req = RestContext.request;
Id callId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Blob pic ;//Blob variable to capture decoded image
if(encodedsignature!=null) {
pic=EncodingUtil.base64Decode(encodedSignature);//Decode the base64 encoded image 
 }
Attachment a = new Attachment (ParentId = callId,
Body = pic,
ContentType = 'image/png',
Name = 'Doctors Signature');
insert a;
return a.Id;
    }
}
Now comes the testing part and good news is that we can use workbench to test this as well
To test this open the workbench REST utility and then you can post the JSON request body
Here is the example request body
{
"encodedSignature":"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"
}
To convert your image into base64 encode format you can use the http://www.base64-image.de/ .You can upload your image and this gives you the base64 encoded string just attach in your JSON parameter

Please note this is just an alternate solution and not the recommended approach but if there are no options left then not a bad idea to try this for small file load of attachment

Introducing Lightning Base Components

Lightning Base Components are great addition to the platform and in fact revolutionary .One of the concerns around lightning component ...