How to Build a Basic Salesforce REST API (With Test Class) and Test with POSTMAN

Salesforce : Creating Anonymous Apex REST APIs with Force.com

The Force.com REST API lets you integration with Force.com applications using standard HTTP methods. This API provides a way to expose the data you have within your Force.com application to external applications – both mobile and non-mobile. A few useful bits of information related to these REST APIs:

This sample Code you how to implement a simple REST API to fetch Account in Apex class:

@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
    @HttpGet
    global static Account doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId];
        return result;
    }
}


Call to REST Client (with Curl) : curl -H "Authorization: Bearer sessionId" "https://instance.salesforce.com/services/apexrest/Account/accountId"
Replace sessionId with the element that you noted in the login response.
Replace instance with your element.
Replace accountId with the ID of an account which exists in your organization.
After calling the doGet method, Salesforce returns a JSON response with data such as the following:

{
  "attributes" : 
    {
      "type" : "Account",
      "url" : "/services/data/v22.0/sobjects/Account/accountId"
    },
  "Id" : "accountId",
  "Name" : "Acme"

}

This sample Code you how to implement a simple REST API to fetch Account in Apex that handles two different HTTP request methods (Commonly Used) :

@RestResource(urlMapping='/Account/*')
global with sharing class RestAccountController {
    @HttpGet
    global static Account doGet() {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        String accountId = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
        Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId];
        return result;
    }
  
    @HttpPost
    global static Account doPost(string accountId) {
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE Id = :accountId];
        return result;
    }

    @HttpPost
    global static Account doPost(){
        String accountId = RestContext.request.requestBody.toString();
        Account acc = [SELECT Id FROM Account WHERE id =: accountId];
        return acc;        
    }

}

Create a file called account.txt to contain the data for the account you will create in the next step. (For JSON in POSt Data) curl -H "Authorization: Bearer sessionId" -H "Content-Type: application/json" -d @account.txt "https://instance.salesforce.com/services/apexrest/Account/"
Replace sessionId with the element that you noted in the login response.
Replace instance with your element.
Replace accountId with the ID of an account which exists in your organization.
After calling the doGet method, Salesforce returns a JSON response with data such as the following:

{
  "attributes" : 
    {
      "type" : "Account",
      "url" : "/services/data/v22.0/sobjects/Account/accountId"
    },
  "Id" : "accountId",
  "Name" : "Acme"

}

Test Class for REST API in Salesforce

@isTest
public class RestAccountControllerTest {
    @testSetup static void setup() {
        Account ac = (Name='TradePortal') ;
        insert ac;        
    }
    @isTest
    static void RestAccountControllerGetProcess(){      
        Account acc = [SELECT Id FROM Account LIMIT 1];
        RestRequest request = new RestRequest();
        request.requestUri =https://instance.salesforce.com/services/apexrest/Account/'+acc.Id;
        request.httpMethod = 'POST';
        RestContext.request = request;
        RestAccountController.doGet();        
        
    }
    @isTest
    static void RestAccountControllerPostProcess(){     
        Account acc = [SELECT Id FROM Account LIMIT 1];
        RestRequest request = new RestRequest();
        request.requestUri =https://instance.salesforce.com/services/apexrest/Account';
        request.httpMethod = 'POST';
        request.addHeader('Content-Type', 'application/json'); 
        RestContext.request = request;
        RestAccountController.doPost(acc.Id);        
    }
}

Test With Postman REST Client :

Resource after Before request to REST API

Session Id for Authorization : "Authorization: Bearer sessionId" Replace sessionId with the element that you noted in the login response.
Server Instance URL of ORG : "https://instance.salesforce.com/services/apexrest/Account/" Replace instance with your element.
accountId : Replace accountId with the ID of an account which exists in your organization.

For Get :

For POST :

Happy Sharing...

Everyone has their own favourites, so please feel free to share yours in the comments below!

Comments

  1. Methods defined as TestMethod do not support Web service callouts
    Getting this error

    ReplyDelete

Post a Comment

Popular posts from this blog

Salesforce LWC : Compact Layout on Hover

Salesforce LWC With Third Party JS : D3

Communications between Lightning Components : Salesforce