Wednesday 21 June 2017

Test Salesforce API by Postman Rest Client | Postman and Salesforce | Calling APEX Rest service using Postman| OAuth 2.0


Force.com platform support powerful web services API for interaction with external app and salesforce.com . For secured interaction with third party app, Salesforce enforces authentication process.


Above image is picked from here.

If you want to configure the same the help of recording. Click here for recording.

Step 1) Connected App for OAuth

To perform OAuth in salesforce, you must create Connected App in salesforce

Follow below step to create connected App.

1) Click on Setup->Create->App


2) Then from above screen click on Connect Apps then New button. Then add all required information like below



 3) Now After creating connected App we have consumer key and consumer secret



Step 2) Create a REST API in salesforce.

Please check below post for REST API
1) Learn Rest API in salesforce | How to learn Rest API | Rest API in salesforce
2) Rest API in Salesforce | Execute Rest API on workbench | Test class for Rest API

Sample code to Start


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

@HttpDelete
global static void doDelete()
{
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
String AccNumber = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE AccountNumber = :AccNumber ];
delete result;
}

@HttpPost
global static String doPost(String name,String phone,String AccountNumber )
{
Account acc = new Account();
acc.name= name;
acc.phone=phone;
acc.AccountNumber =AccountNumber ;
insert acc;

return acc.id;
}

}

Step 3) Get Access Token by POSTMAN

  3.1) Install the postman from here.

  Download URL :- https://www.getpostman.com/

  3.2) Generate URL

  OAuth Endpoints in Salesforce
  Authorization
: https://login.salesforce.com/services/oauth2/authorize
  Token Request: https://login.salesforce.com/services/oauth2/token




  There are two way to get Access token
  1) By Post Callout (Direct URL)
  2) By OAuth Setting in POSTMAN (Wizard one)

  3.2.1:- By Post Callout (Direct URL)

  Use below link to Generate the Token for accessing SFDC

https://na50.salesforce.com/services/oauth2/token?grant_type=password&client_id=***Consumer Key_Here***&client_secret=***Consumer Secret_Here***&username=*********&password=*****password+securityToken******






NOTE:-   May be After try to login you will get below error "Failed: Not approved for access"



     Please check below post to resolve this issue
    1) https://help.salesforce.com/articleView?id=000212208&language=en_US&type=1
    2) http://amitsalesforce.blogspot.com/2017/06/failed-not-approved-for-access-in.html
  

  Finally We have Access Token

  3.2.2:- By OAuth Setting in POSTMAN (Wizard one)

  •   Select Type OAuth 2.0

  • Then click on  "Get Access Token". Then provide all below detail.

  • Then click on Request Token button. Then it will ask you to enter userName and password.


  • Here we have Access Token
  


Step 4) Test APEX REST API. 

Now Copy the Access Token from above Screen. Add below detail to make get call



a.       End point URL: https://na50.salesforce.com/services/apexrest/api/Account/12345
b.      Select method as ‘GET
c.       Put the details in header as below:
Authorization: OAuth + Access Token



Or you can try like below as well.


Now Copy the Access Token from above Screen. Add below detail to make get call


a.       Click Add Token to "Header"
b.      Then select "Use Token"
c.       Then select Get Method and add below URL
https://na50.salesforce.com/services/apexrest/api/Account/12345




Please check below recording for end to end POSTMAN setup



Check this post to learn about how to configure SoapUI to run SOAP API Calls.


Related Post
1) Apex REST Basic Code Sample
2) Rest API
3) Understanding the Web Server OAuth Authentication Flow

Please let us know if this will help you

Thanks
Amit Chaudhary

Sunday 18 June 2017

Failed: Not approved for access in salesforce



After entering credentials and attempting to login to Salesforce, the API user is denied access to the application and is typically accompanied by a Login History Status of "Failed: Not approved for access".




Solution:-

Update  OAuth policies and set Permitted Users to "All users may self-authorize".

Step 1) Open the connected App the click on Manage button.




Step 2) Then click on Edit policies button




Step 3)  then update "OAuth policies"





     Please check below post to resolve this issue
    1) https://help.salesforce.com/articleView?id=000212208&language=en_US&type=1


Thanks
Amit Chaudhary

Saturday 10 June 2017

Salesforce Apex Hours:- Salesforce DX



Farmington Hill Salesforce Developer group / "Salesforce Apex Hours" organized another successful Online session/event on Saturday, JUNE 10, 2017 , focusing on "Salesforce DX".

"Salesforce Apex Hours" is a recurring event to talk about salesforce ! This time we planned one online session on "Salesforce DX" with Jitendra Zaa (Salesforce MVP).

Agenda :-
Salesforce DX provides you with an integrated, end-to-end lifecycle designed for high-performance agile development. In this session we would go through hands on and see how Salesforce DX can be used to create scratch org, automated testing and data load purpose. We would discuss CLI option as well Force.com IDE

  • Introduction to Salesforce DX
  • Creating Scratch Org
  • Deploying metadata to Scratch Org
  • Creating Skeleton Workspace
  • Running Test classes
  • Getting Help
  • Using Force.com IDE with Salesforce DX
  • Q&A 

Speaker : -Jitendra Zaa (Salesforce MVP) ,Amit Chaudhary
Date :- Saturday, JUNE 10, 2017 11:00 AM EST
Venue/Link :- Online.




Here is PPT of Session


https://www.slideshare.net/AmitChaudhary112/salesforce-apex-hours-salesforce-dx


Here is Session Recording







Related Post
1) Salesforce DX.



Thanks
Amit Chaudhary @amit_sfdc
Email :- amit.salesforce21@gmail.com




Friday 9 June 2017

WebService Methods in Salesforce


1) You can't use the web-Service keyword to define an interface,
2) System defined enums cannot be used in Web-service methods
3) You can't use the webService keyword in a trigger
4) All classes that contain methods defined with the webService keyword must be declared as global.
5) Methods defined with the webService keyword are inherently global. These methods can be used by any Apex code that has access to the class. You can consider the webService keyword as a type of access modifier that enables more access than global
6) You should define any method that uses the web-Service keyword as static
7) You can't deprecate webService methods or variables in managed package code
8) Methods defined with the webService keyword cannot take the following elements as parameters. While these elements can be used within the method, they also cannot be marked as return values.
  • Maps
  • Sets
  • Pattern objects
  • Matcher objects
  • Exception objects

9) You can use the web-service modifier to define top level, outer class methods and variables, and member variables of an inner class. It can't be used on a class itself, or an interface or interface methods or variables.

NOTE:-  Invoking a custom webService method always uses system context. Consequently, the current user's credentials are not used, and any user who has access to these methods can use their full power, regardless of permissions, field-level security, or sharing rules. Developers who expose methods with the webService keyword should therefore take care that they are not inadvertently exposing any sensitive data

Apex class methods that are exposed through the API with the webService keyword don't enforce object permissions and field-level security by default


global class MyWebService {
    webService static Id makeContact(String lastName, Account a) {
        Contact c = new Contact(lastName = 'Weissman', AccountId = a.Id);
        insert c;
        return c.id;
    }
}