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.
To generate an Apex class from a WSDL:
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. The SOAP request from, and response to, calls is limited to 1 MB or less.
After you have generated a class from the WSDL, you can invoke the external service referenced by the WSDL.
To invoke an external service after using its WSDL document to generate an Apex class, create an instance of the stub in your Apex script and call the methods on it. For example, to invoke the StrikeIron IP address lookup service from Apex, you could write a script similar to the following:
// Create the stub strikeironIplookup.DNSSoap dns = new strikeironIplookup.DNSSoap(); // Set up the license header dns.LicenseInfo = new strikeiron.LicenseInfo(); dns.LicenseInfo.RegisteredUser = new strikeiron.RegisteredUser(); dns.LicenseInfo.RegisteredUser.UserID = 'you@company.com'; dns.LicenseInfo.RegisteredUser.Password = 'your-password'; // Make the Web service call strikeironIplookup.DNSInfo info = dns.DNSLookup('www.myname.com');
You can set the HTTP headers on a Web service callout. For example, you can use this feature to set the value of a cookie in an authorization header. To set HTTP headers, add inputHttpHeaders_x and outputHttpHeaders_x to the stub.
The following samples work with the sample WSDL file in Understanding the Generated Code:
docSample.DocSamplePort stub = new docSample.DocSamplePort(); stub.inputHttpHeaders_x = new Map<String, String>(); //Setting a basic authentication header stub.inputHttpHeaders_x.put('Authorization', 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='); //Setting a cookie header stub.inputHttpHeaders_x.put('Cookie', 'name=value'); //Setting a custom HTTP header stub.inputHttpHeaders_x.put('myHeader', 'myValue'); String input = 'This is the input string'; String output = stub.EchoString(input);
If a value for inputHttpHeaders_x is specified, it overrides the standard headers set.
docSample.DocSamplePort stub = new docSample.DocSamplePort(); stub.outputHttpHeaders_x = new Map<String, String>(); String input = 'This is the input string'; String output = stub.EchoString(input); //Getting cookie header String cookie = stub.outputHttpHeaders_x.get('Set-Cookie'); //Getting custom header String myHeader = stub.outputHttpHeaders_x.get('My-Header');
The value of outputHttpHeaders_x is null by default. You must set outputHttpHeaders_x before you have access to the content of headers in the response.
The following limits apply when an Apex script makes a callout to an HTTP request or a Web services call. The Web services call can be a Force.com Web Services API call or any external Web services call.
You can send a client certificate with your callout to authenticate an HTTPS connection with a specified value. Perform the following tasks to support client certificates:
The following example illustrates the last step of the previous procedure and works with the sample WSDL file in Understanding the Generated Code:
docSample.DocSamplePort stub = new docSample.DocSamplePort(); stub.clientCert_x = 'MIIGlgIBAzCCBlAGCSqGSIb3DQEHAaCCBkEEggY9MIIGOTCCAe4GCSqGSIb3DQEHAaCCAd8EggHb'+ 'MIIB1zCCAdMGCyqGSIb3DQEMCgECoIIBgjCCAX4wKAYKKoZIhvcNAQwBAzAaBBSaUMlXnxjzpfdu'+ '6YFwZgJFMklDWFyvCnQeuZpN2E+Rb4rf9MkJ6FsmPDA9MCEwCQYFKw4DAhoFAAQU4ZKBfaXcN45w'+ '9hYm215CcA4n4d0EFJL8jr68wwKwFsVckbjyBz/zYHO6AgIEAA=='; // Password for the keystore stub.clientCertPasswd_x = 'passwd'; String input = 'This is the input string'; String output = stub.EchoString(input);
Apex supports only the document literal wrapped WSDL style and the following primitive and built-in datatypes:
| Schema Type | Apex Type |
|---|---|
| xsd:anyURI | String |
| xsd:boolean | Boolean |
| xsd:date | Date |
| xsd:dateTime | Datetime |
| xsd:double | Double |
| xsd:float | Double |
| xsd:int | Integer |
| xsd:integer | Integer |
| xsd:language | String |
| xsd:long | Long |
| xsd:Name | String |
| xsd:NCName | String |
| xsd:nonNegativeInteger | Integer |
| xsd:NMTOKEN | String |
| xsd:NMTOKENS | String |
| xsd:normalizedString | String |
| xsd:NOTATION | String |
| xsd:positiveInteger | Integer |
| xsd:QName | String |
| xsd:short | Integer |
| xsd:string | String |
| xsd:time | Datetime |
| xsd:token | String |
| xsd:unsignedInt | Integer |
| xsd:unsignedLong | Long |
| xsd:unsignedShort | Integer |
Apex also supports the following schema constructs:
The following data types are only supported when used as call ins, that is, when an external Web service calls an Apex Web service method. These data types are not supported as callouts, that is, when an Apex Web service method calls an external Web service.
Apex does not support any other WSDL constructs, types, or services, including:
<wsdl:types> <xsd:schema elementFormDefault="qualified" targetNamespace="http://s3.amazonaws.com/doc/2006-03-01/"> <xsd:include schemaLocation="AmazonS3.xsd"/> </xsd:schema> </wsdl:types>
However, an import within the same schema is supported. In the following example, the external WSDL is pasted into the WSDL you are converting:
<wsdl:types> <xsd:schema xmlns:tns="http://s3.amazonaws.com/doc/2006-03-01/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://s3.amazonaws.com/doc/2006-03-01/"> <xsd:element name="CreateBucket"> <xsd:complexType> <xsd:sequence> [...] </xsd:schema> </wsdl:types>