SFDC Stop - Always the latest about Salesforce


Full Tutorial Series with videos, free apps, live sessions, salesforce consulting and much more.


Telegram logo   Join our Telegram Channel
Showing posts with label SOAP UI. Show all posts
Showing posts with label SOAP UI. Show all posts

Sunday, 9 February 2020

Salesforce Integration Tutorial Part 12 - Creating a SOAP Web Service in Apex

Hello Trailblazers,

Welcome to the 12th tutorial of the Salesforce Integration Tutorial series. In the previous tutorial, we created a mock class and a test class for our SOAP API callout. You can find that tutorial by clicking here. In this tutorial, we're mainly going to create a web service i.e. a custom SOAP API in Salesforce.

Remember the 2nd tutorial of Integration Tutorial Series in which we created a custom REST API and explored GET method in detail ? Let's recall that code by having a look below:-

As you can see above, we have a method named as:- getContactIdAndNames() which is called when we make a get request to this API. Inside this method, we're getting the contactLimit i.e. the number of contacts to be queried as a URL parameter and we're returning a list of contacts in the response.

Creating a custom SOAP API

Now, I am going to convert the same method into a webservice method so that it's converted into a SOAP API and then we'll generate a WSDL file for it and call it from SOAP UI client. If you're not aware of SOAP UI, please have a look at this tutorial first and then you can come back to the current tutorial as we're going to use SOAP UI client to hit our custom SOAP API and get the response.

Let's have a look at the updated code below:-

As you can see above, I removed all the annotations like:- @HTTPPost @RestResource etc. as we don't need them in case of defining a SOAP API. All we need is a global class with a static method defined with webservice keyword. The number of contacts to query that we were giving previously as a URL parameter are now given in the method parameter named as:- contactLimit. After that we're simply querying the contacts and returning the list of contacts in the response.

And that's all. You have successfully created a custom SOAP API in Salesforce. SOAP APIs basically support GET and POST HTTP Methods according to the w3 specifications defined here:- https://www.w3.org/TR/2007/REC-soap12-part0-20070427/#L26854 but we mostly use POST in case of SOAP requests as we have messages encoded in XML format. So, whenever you need to create a SOAP webservice in Salesforce, all you need to do is to define a static method in a global class with the keyword webservice. You can take the input as a parameter in method and the data returned by the method will be given in the response.

Generating a WSDL file

Now, it's time to test our custom SOAP API that will return the contact id and names of contacts present in salesforce and we can limit those contacts by giving the contactLimit in the input request XML. Remember, when we wanted to consume a SOAP API we used WSDL2Apex to generate an apex class from WSDL. In the same way you can generate a WSDL from your custom apex class. All you need to do is go to setup and search for apex classes. Click on Apex Classes under Develop and you'll see the below page:-


As you can see above in the ContactResource class I have an option of WSDL. Either you can click this or when you open the ContactResource class, you'll see a Generate WSDL button as shown below:-


On clicking this button you can see another xml which is the WSDL file for our custom SOAP API that we just created. It'll look similar as you can see below:-


You can provide this XML to the 3rd party who wants to consume your custom SOAP API and it'll be able to connect with Salesforce.

Testing our SOAP API using SOAP UI

Now we have the WSDL for our custom SOAP API. So, it's time to test our SOAP API. I have already imported the Enterprise WSDL into the SOAP UI and got the session id. If you want to learn that, you can have a look at another tutorial by clicking here. I am going to add our new WSDL to the existing project. To do that, just right click on the project and click on Add WSDL as shown below:-

You'll see a dialog as shown below:-


Choose your custom WSDL file and click on OK. When I tried to import the WSDL and clicked on OK button, I got some errors as shown below:-


These errors are coming because the WSDL file that we downloaded from Salesforce has some tags missing. For ex:- The first error is regarding the ChangeEventHeader which is not found in our WSDL file. However, I checked Enterprise WSDL and I was able to find the ChangeEventHeader as shown below:-


The other errors are related to some other type tags like:- json, stringList. You can find all the missing data in the enterprise wsdl and can copy from there to update your actual wsdl file.

I tried and added the ChangeEventHeader, json, and stringList xml types that were missing in my custom WSDL file below the schema tag as shown below:-


Please note that I have added xsd: namespace also along with the parent tag name for consistency, as all the other tags were having this namespace in the custom xml file I am trying to import. I tried to import my WSDL file in SOAP UI again and found that those 3 errors are resolved and I have some of the remaining errors that I need to resolve.


So, I updated the the custom API xml file again adding the missing contents and tried to import that file again. Finally, I got my XML imported into SOAP UI and our method getContactIdAndNames is available with the input XML request as shown below:-


I am also sharing the XML changes I did below, so that you can just add-on the same elements in your custom XML in case the error is exactly same. Otherwise you'll find all the missing elements in Enterprise XML from Salesforce.

Now, It's time to test our API. As you can see in the image below, I commented out the XML tags that I am not using, added the session id received from login request between the con:sessionId xml tag. Between the con:getContactIdAndNamesTag I have another tag named as con:contactLimit, which is nothing but the parameter of our apex method. I have specified the limit as 2 here as I just want to fetch 2 contacts from my org with Id and Name.


As you can see above, on the left hand side I have the request XML that I sent using the green play button above and on the right hand side, I have the response xml with 2 contacts queried from my Salesforce Org with Id and Name of each contact.

Tired of reading or just scrolled down, don't worry, you can watch the video too.



That's all for this tutorial. Today, you learned about creating a custom SOAP API in Salesforce and testing it using SOAP UI. You can find the code used in this tutorial in the soapapi branch of my SFDC-Integration-Tutorial github repository here. If you liked this tutorial, make sure to share it in your network and let me know your feedback in the comments down below.

Happy Trailblazing..!!

Saturday, 8 February 2020

How to connect to Salesforce using SOAP APIs ? SOAP UI Tutorial

Hello Trailblazers,

SOAP UI is a very popular API testing tool specially when we talk about SOAP APIs. So, in this tutorial, we're going to see how we can connect with Salesforce Org using SOAP UI and we will call a standard salesforce soap api and have a look at the response. If you want to learn about connecting with Salesforce using REST APIs you can have a look at this tutorial. So, let's begin:-

Download SOAP UI

You can download SOAP UI by going to https://www.soapui.org/downloads/soapui.html and you'll see the below screen:-


As you can see above, there are two options. For advanced testing, you can download SOAP UI Pro however, we're going to download SOAP UI Open Source for this tutorial. Just click on the green button and your download will start automatically. If not, you can also click on the click here link on the next page as shown below:-


Once you've downloaded SOAP UI, open the installer and follow simple steps to install SOAP UI. You can keep the settings as default as we don't need any specific configuration while installing SOAP UI. Once you've downloaded and installed SOAP UI, open that and you'll see a start page similar to as shown below:-


Salesforce Enterprise WSDL

So, you've downloaded and installed SOAP UI. The next step is to download enterprise wsdl file from your Salesforce Org. Go to setup and search for api and click on API under Integrations. You'll see the screen as shown below:-


Click on Generate Enterprise WSDL link and you'll see the below page:-


This page is showing the managed packages versions that are installed in your org that you want to use in SOAP API integration with Salesforce. As for this tutorial, we're not going to connect with any managed package so this doesn't matter to us. Click on the Generate button and you'll see an xml as shown below:-


Save this xml file in your system as you save any html page (Ctrl + S for windows) and that's all. Now it's time to create a new project in our SOAP UI and test a standard Salesforce SOAP API.

Connecting with Salesforce using SOAP UI

1. Open SOAP UI, go to the File menu and click on New SOAP Project.


2. You'll see a dialog as shown below:-


As you can see above, I have given the project name as:- SFDCStopOrg (you can give any name of your choice). In Initial WSDL field, I have selected the Enterprise WSDL file downloaded from my Salesforce Org. Click on OK button and a new project will be created and will be shown on the left hand side panel as shown below:-


As you can see above, there are a number of operations that we can perform in our Salesforce Org such as:- changing password, converting lead etc. using standard SOAP APIs that are available.

3. Login to Salesforce:- Before testing any operation, our first step as to login to salesforce as we did in case of REST APIs. Here also, we need to get a token to interact with our Salesforce Org. Out of the different operations that are available in the left panel, look out for login and click on the Request 1 available under that as shown below:-


You'll see an xml request shown on the right side with 4 fields that we can fill up namely:- organizationIdportalId in the header and usernamepassword in the body. We don't need to fill organization id and we don't have a customer portal too so you can simply remove the question marks (?) from these tags to make them empty and fill up the username between the urn:username tags and password appended with security token between the urn:password tags as shown below:-


If you don't know your security token you can simply go to user settings which you can find below your profile picture.


Click on settings and search for reset and you will find an option to reset your security token.


Click on Reset Security Token button and you'll receive a mail from Salesforce with a new security token that you can append with your password in the urn:password field. Once your login request is ready, click on the green play button to submit the request.


You can see the reponse of this request in the right panel as shown below:-


As you can see in the response above, there is a tag named sessionId that consist of the token which we need to use in all our API requests to Salesforce. Just above that there is another tag named serverUrl which is our server URL for making SOAP requests to Salesforce Org. Copy this session id and server url and let's open another request to fetch data from Salesforce. 

Executing a Query using SOAP UI

Let's have a look at the below request in which I am querying Accounts using SOAP UI. I selected the Request 1 under the query operation from the left hand sidebar. The server URL which we got from login request is set in the address bar and the session id is set between the request xml urn:sessionId tag. You can see that I have commented some of the tags as they were not required for our operation. I have specified the query as:- SELECT Id, Name FROM Account between the urn:queryString tag as shown in the below image.


Submit the request using the green play button and you'll get a response as shown on the right hand side in the image above. You can see that I am receiving the id and name of accounts in the response xml as queried from Salesforce.

Congratulations..!! You've successfully connected with Salesforce using SOAP UI and fetched a list of accounts using the standard SOAP API available for executing query. In the same way, we can add a wsdl to the same project for a custom SOAP API that we can create in Salesforce using apex and test the same. The server URL will be already present in that case when we import a custom API wsdl. That's all for this tutorial, if you liked it, make sure to share it among your network and let me know your feedback in the comments down below.

Tired of reading or just scrolled down, don't worry, you can watch the video too.



P.S.:- If you want to learn Salesforce Integration, check out:- Salesforce Integration Tutorial Series.

Happy Trailblazing..!!