Thursday, July 6, 2017

REST API TUTORIAL FOR SALESFORCE

REST API provides a powerful, convenient, and simple Web services API for interacting with Force.com. Its advantages include ease of integration and development, and it’s an excellent choice of technology for use with mobile applications and Web 2.0 projects.

A REST resource is an abstraction of a piece of information, such as a single data record, a collection of records, or even dynamic real-time information. Each resource in the Force.com REST API is identified by a named URI, and is accessed using standard HTTP methods (HEAD, GET, POST, PATCH, DELETE). The Force.com REST API is based on the usage of resources, their URIs, and the links between them. You use a resource to interact with your Salesforce or Force.com organization. For example, you can:
  •  Retrieve summary information about the API versions available to you.
  • Obtain detailed information about a Salesforce object such as an Account or a custom object.
  • Obtain detailed information about Force.com objects, such as User or a custom object.
  • Perform a query or search.
  • Update or delete records.


In this blog, I will be explaining how to interact with Salesforce using REST API.  I will be creating a VF page named as “RESTAPIPlayground”. On this page you can specify different parameters which is required to send HTTPRequest like Access token, end point URL (URI), HTTP method etc. VF page will display the response from Salesforce and will also display the Apex code to send HTTPRequest.

Here I assume that you are aware of how to generate access token from salesforce using oAuth2.0. If you want to learn this first then refer to my earlier blog:


Once you have access token of salesforce with which you want to interact then you can use this playground (VF Page) to play with different options available under REST API.

Create a Apex class "RESTAPIPlaygroundController" and VF Page "RESTAPIPlayground". Below is code for Apex Class and VF page.

public class RESTAPIPlaygroundController {
public String strSelectedAppId{get;set;}
public String strURI{get;set;}
public String strSelectedMethod{get;set;}
public String strSelectedContentType{get;set;} //JSON or XML
public String strRequestBody{get;set;}
public String strResponse{get;set;}
public String strApexCode{get;set;}
public String strAccessToken{get;set;}
public RESTAPIPlaygroundController(){
strSelectedMethod='GET';
strSelectedContentType='.xml';
}
public list<selectoption> getAvailableHTTPmethods(){
list<selectoption> options=new list<selectoption>();
options.add(new selectoption('GET','GET'));
options.add(new selectoption('PATCH','PATCH'));
options.add(new selectoption('POST','POST'));
//options.add(new selectoption('PUT','PUT'));
options.add(new selectoption('DELETE','DELETE'));
return options;
}
public List<selectoption> getContentType(){
List<selectoption> options=new List<selectoption>();
options.add(new selectoption('.json','JSON'));
options.add(new selectoption('.xml','XML'));
return options;
}
public pageReference sendRequest(){
String errmsg=validateInputparametrs();
system.debug('*********errmsg'+errmsg);
if(errmsg!=null && errmsg!=''){
ApexPages.addMessage(new apexpages.message(ApexPages.severity.Error,errmsg));
}else{
HttpRequest req=createHTTPRequest();
HTTPResponse res=sendRequest(req);
strResponse=res+'\n';
strResponse=res.getBody();
}
return null;
}
public HttpRequest createHTTPRequest(){
HttpRequest req = new HttpRequest();
strApexCode='HttpRequest req = new HttpRequest();\n';
String endpointURL;
if(strAccessToken!=null && strAccessToken!=''){
//setting end point URL
if(strURI!=null && strURI!=''){
if(strURI.endswith('/')){
strURI=strURI.substring(0,strURI.length()-2);
}
endpointURL=strURI;
system.debug('************endpointURL:'+endpointURL);
if(strSelectedMethod.equalsignorecase('PATCH')){
endpointURL+='?_HttpMethod=PATCH';
}
req.setEndpoint(endpointURL);
strApexCode+='req.setEndpoint('+endpointURL+');\n';
}
//setting request headers
if(strSelectedContentType.equalsignorecase('.xml')){
req.setHeader('Content-Type', 'application/xml; charset=utf-8');
strApexCode+='req.setHeader(\'Content-Type\', \'application/xml; charset=utf-8\');\n';
req.setHeader('Accept', 'application/xml');
strApexCode+='req.setHeader(\'Accept\', \'application/xml\');\n';
}else{
req.setHeader('Content-Type', 'application/json; charset=utf-8');
strApexCode+='req.setHeader(\'Content-Type\', \'application/json; charset=utf-8\');\n';
}
req.setHeader('Authorization','Authorization: Bearer '+strAccessToken);
strApexCode+='req.setHeader(\'Authorization\',\'Authorization: Bearer '+strAccessToken+');\n';
//setting HTTP method
if(strSelectedMethod!=null && strSelectedMethod!=''){
if(strSelectedMethod.equalsignorecase('GET')){
req.setMethod('GET');
strApexCode+='req.setMethod(\'GET\');\n';
}else if(strSelectedMethod.equalsignorecase('POST') || strSelectedMethod.equalsignorecase('DELETE') || strSelectedMethod.equalsignorecase('PUT')){
req.setMethod(strSelectedMethod);
strApexCode+='req.setMethod('+strSelectedMethod+');\n';
string body=strRequestBody;
req.setBody(body);
strApexCode+='req.setBody('+body+');\n';
req.setHeader('Content-Length', '1024');
strApexCode+='req.setHeader(\'Content-Length\',\'1024\');\n';
req.setTimeout(12000);
strApexCode+='req.setTimeout(1200);\n';
}
else if(strSelectedMethod.equalsignorecase('PATCH')){
req.setMethod('POST');
strApexCode+='req.setMethod(\'POST\');\n';
string body=strRequestBody;
req.setBody(body);
strApexCode+='req.setBody('+body+');\n';
req.setHeader('Content-Length', '1024');
strApexCode+='req.setHeader(\'Content-Length\',\'1024\');\n';
req.setTimeout(12000);
strApexCode+='req.setTimeout(1200);\n';
}
}
}
system.debug('***************strApexCode:'+strApexCode);
system.debug('***************HttpRequest req:'+req);
return req;
}
public HTTPResponse sendRequest(HttpRequest Req){
Http http = new Http();
strApexCode+='Http http = new Http();\n';
HTTPResponse res = http.send(req);
strApexCode+='HTTPResponse res = http.send(req);\n';
System.debug('****************res.getStatusCode();'+res.getStatusCode());
return res;
}
public string validateInputparametrs(){
String errmsg;
if(strAccessToken==null || strAccessToken==''){
errmsg='Please specify Access Token.\n';
}if(strURI==null || strURI==''){
errmsg+=' Please specify REST API service URI (Endpoint URL).\n';
}if(strSelectedMethod==null || strSelectedMethod==''){
errmsg+=' Please specify Http method.\n';
}
system.debug('*********errmsg'+errmsg);
return errmsg;
}
}
<apex:page controller="RESTAPIPlaygroundController" sidebar="false">
<style>
.table .tr .td{
width:100%;
}
</style>
<apex:form >
<apex:pagemessages />
<apex:pageblock mode="maindetail" title="REST API TUTORIAL">
<table width="100%">
<tr width="100%">
<td width="50%">
<table>
<tr><th>Request Parameters</th> </tr>
<tr><td><apex:outputlabel value="Enter Access token" /></td></tr>
<tr><td><apex:inputtextarea value="{!strAccessToken}" id="AcessToken" style="width:100%;"/> </td></tr>
<tr><td><apex:outputlabel value="REST API service URI" /></td></tr>
<tr><td><apex:inputtextarea value="{!strURI}" id="URI" style="width:100%;"/> </td></tr>
<tr><td><apex:outputlabel value="Choose an HTTP method to perform on the REST API service URI" /></td></tr>
<tr>
<td>
<apex:selectradio value="{!strSelectedMethod}" id="sm">
<apex:selectoptions value="{!AvailableHTTPmethods}" />
</apex:selectradio>
</td>
</tr>
<tr><td><apex:outputlabel value="Content Type" /></td></tr>
<tr>
<td>
<apex:selectlist value="{!strSelectedContentType}" size="1" id="cont">
<apex:selectoptions value="{!ContentType}"/>
</apex:selectlist>
</td>
</tr>
<tr><td><apex:outputlabel value="Request Body" /></td></tr>
<tr><td><apex:inputtextarea value="{!strRequestBody}" id="reqbody" style="width:100%;"/> </td> </tr>
</table>
</td>
<td width="50%">
<table>
<tr><th>Apex Code</th></tr>
<tr><td><apex:inputtextarea value="{!strApexCode}" id="ac" style="width:500px;height:300px;"/></td></tr>
</table>
</td>
</tr>
</table>
<br/>
<apex:commandbutton value="Send request" action="{!sendRequest}"/>
<br/>
<!-- Response section -->
<table width="100%">
<tr>
<th>HTTP Response</th>
</tr>
<tr>
<td><apex:inputtextarea value="{!strResponse}" id="res" style="width:100%;height:400px;"/></td>
</tr>
</table>
</apex:pageblock>
</apex:form>
</apex:page>

Below is snapshot of REST API Playground. You can specify the Access_Token, REST API service URI (endpoint URL), HTTP method and content type (json or xml), request body (in case of patch and post method). Once you click on send request, system will display the HTTP response.

Note: Add the REST API service URI (end point URL) to remote site settings before sending HTTPRequest.


No comments:

Post a Comment