Invoking Callouts Using Apex
Invoking Callouts Using Apex
* An Apex callout enables you to tightly integrate your Apex with an external service by making
a call to an external Web service or sending a HTTP request from an Apex script and then
receiving the response.
Tightly Couple Architecture
* Apex provides integration with Web services that utilize SOAP and WSDL, or HTTP services
Note:Before any Apex callout can call an external site, that site must be registered in the
Remote Site Settings page, or the callout fails.
* Salesforce prevents calls to unauthorized network addresses.
* Callouts enable Apex to invoke external web or HTTP services.
*Apex Web services allow an external application to invoke Apex methods through Web
Adding Remote Site Settings
To add a remote site setting:
1. Click Your Name ➤ Setup ➤ Security Controls ➤ Remote Site Settings.
2. Click New Remote Site.
3. Enter a descriptive term for the Remote Site Name.
4. Enter the URL for the remote site.
5. Optionally, enter a description of the site.
6. Click Save.
Types of WSDL's
1. Enterprise WSDL
* It is a big WSDL which contains information about schema of organization.
* Strictly Typed: For Integer if we give 3.19 like that then it will not accept and throw error.
* When schema is modified then we have to recreate new enterprise WSDL.
2. Partner WSDL
* Loosly Typed: For Integer if we give 3.19 like that then it will accept and not throw error.
* When schema is modified then it will automatically updated.
SOAP Services: Defining a Class from a WSDL Document
* Classes can be automatically generated from a WSDL document that is stored on a local hard
drive or network.
* Creating a class by consuming a WSDL document allows developers to make callouts to the
external Web service in their Apex scripts.
- Use Outbound Messaging to handle integration solutions when possible.
- Use callouts to third-party Web services only when necessary.
To generate an Apex class from a WSDL:
1. In the application, click Your Name ➤ Setup ➤ Develop ➤ Apex Classes.
2. Click Generate from WSDL.
3. Click Browse to navigate to a WSDL document on your local hard drive or network, or type in
the full path. This WSDL document is the basis for the Apex class you are creating.
- The WSDL document that you specify might contain a SOAP endpoint location that references
an outbound port.
- For security reasons, Salesforce restricts the outbound ports you may specify to one of the
- 80: This port only accepts HTTP connections.
- 443: This port only accepts HTTPS connections.
- 1024–66535 (inclusive): These ports accept HTTP or HTTPS connections.
4. Click Parse WSDL to verify the WSDL document contents.
- The application generates a default class name for each namespace in the WSDL document
and reports any errors.
- Parsing will fail if the WSDL contains schema types or schema constructs that are not
supported by Apex classes, or if the resulting classes exceed 1 million character limit on Apex
- For example, the Salesforce SOAP API WSDL cannot be parsed.
5. Modify the class names as desired.
- While you can save more than one WSDL namespace into a single class by using the same class
name for each namespace, Apex classes can be no more than 1 million characters total.
6. Click Generate Apex.
- The final page of the wizard shows which classes were successfully generated, along with any
errors from other classes.
- The page also provides a link to view successfully-generated code.
* The successfully-generated Apex class includes stub and type classes for calling the third-party
Web service represented by the WSDL document.
* These classes allow you to call the external Web service from Apex.
Note the following about the generated Apex:
* If a WSDL document contains an Apex reserved word, the word is appended with _x when the
Apex class is generated.
* For example, limit in a WSDL document converts to limit_x in the generated Apex class.
* If an operation in the WSDL has an output message with more than one element, the
generated Apex wraps the elements in an inner class.
* The Apex method that represents the WSDL operation returns the inner class instead of the
* After you have generated a class from the WSDL, you can invoke the external service
referenced by the WSDL.
How to run generated class from WSDL
BookrWs.BookWs stub = new BookrWs.BookWs();//Top level class name.Inner level class
stub.sessionHeader = new BookrWs.sessionHeader_Element();
stub.sessionHeader.sessionID = userInfo.getSessionID();