|
ColdFusion provides a variety
of methods for consuming web services. The method that you choose
depends on your ColdFusion programming style and application.
The following table describes these methods:
Method
|
CFML operator
|
Description
|
CFScript
|
()
|
Consumes a web service from within a CFScript
block.
|
CFML tag
|
|
Consumes a web service from within a block
of CFML code.
|
CFML tag
|
|
Consumes a web service from within a block
of CFML code.
|
One important consideration is that all consumption methods use
the same underlying technology and offer the same performance.
About the examplesThe examples shown here reference the TemperatureService
web service from XMethods. This web service returns
the temperature for a given ZIP code. You can read the WSDL file
for this web service in Reading a WSDL file.
The TemperatureService web service has
one input parameter, a string that contains the requested ZIP code.
It returns a float that contains the temperature for the specified
ZIP code.
Passing parameters to a web serviceThe message and operation
elements in the WSDL file contains subelements that define the web
service operations and the input and output parameters of each operation,
including the data type of each parameter. The following example shows
a portion of the WSDL file for the TemperatureService web service:
<message name="getTempRequest">
<part name="zipcode" type="xsd:string"/>
</message>
<message name="getTempResponse">
<part name="return" type="xsd:float"/>
</message>
<portType name="TemperaturePortType">
<operation name="getTemp">
<input message="tns:getTempRequest"/>
<output message="tns:getTempResponse"/>
</operation>
</portType>
The operation name used in the examples is getTemp. This operation
takes a single input parameter defined as a message of type getTempRequest.
You can see that the message element named getTempRequest contains
one string parameter: zipcode. When you call the
getTemp operation, you pass the parameter as input.
Handling return values from a web serviceWeb service operations often
return information back to your application. You can determine the
name and data type of returned information by examining subelements
of the message and operation elements in the WSDL file.
The following example shows a portion of the WSDL file for the
TemperatureService web service:
<message name="getTempRequest">
<part name="zipcode" type="xsd:string"/>
</message>
<message name="getTempResponse">
<part name="return" type="xsd:float"/>
</message>
<portType name="TemperaturePortType">
<operation name="getTemp">
<input message="tns:getTempRequest"/>
<output message="tns:getTempResponse"/>
</operation>
</portType>
The operation getTemp returns a message of type getTempResponse.
The message statement in the WSDL file defines the getTempResponse
message as containing a single string parameter named return.
Using cfinvoke to consume a web serviceWith the cfinvoke tag, you reference the
WSDL file and invoke an operation on the web service with a single
tag.
The cfinvoke tag includes attributes that specify
the URL to the WSDL file, the method to invoke, the return variable,
and input parameters. For complete syntax, see
the CFML Reference.
Access a web service using cfinvokeCreate a ColdFusion page with the following
content:
<cfinvoke
webservice="http://www.xmethods.net/sd/2001/TemperatureService.wsdl"
method="getTemp"
returnvariable="aTemp">
<cfinvokeargument name="zipcode" value="55987"/>
</cfinvoke>
<cfoutput>The temperature at ZIP code 55987 is #aTemp#</cfoutput>
Save the page as wscfc.cfm in your web root directory.
View the page in your browser.
You can omit a parameter by setting
the omit attribute to "yes".
If the WSDL specifies that the argument is nullable, ColdFusion
sets the associated argument to null. If the WSDL specifies minoccurs=0,
ColdFusion omits the argument from the WSDL. However, CFC web services
must still specify required="true" for all arguments.
You can also use an attribute collection to pass parameters.
An attribute collections is a structure where each structure key
corresponds to a parameter name and each structure value is the
parameter value passed for the corresponding key. The following
example shows an invocation of a web service using an attribute
collection:
<cfscript>
stArgs = structNew();
stArgs.zipcode = "55987";
</cfscript>
<cfinvoke
webservice="http://www.xmethods.net/sd/2001/TemperatureService.wsdl"
method="getTemp"
argumentcollection="#stArgs#"
returnvariable="aTemp">
<cfoutput>The temperature at ZIP code 55987 is #aTemp#</cfoutput>
In this example, you create the structure in a CFScript block,
but you can use any ColdFusion method to create the structure.
Using CFScript to consume a web serviceThe following example
uses CFScript to consume a web service. In CFScript, you use the CreateObject function
to connect to the web service. After connecting, you can make requests
to the service. For CreateObject syntax, see the CFML Reference.
After
creating the web service object, you can call operations of the
web service using dot notation, in the following form:
webServiceName.operationName(inputVal1, inputVal2, ... );
You can handle return values from web services by writing them
to a variable, as the following example shows:
resultVar = webServiceName.operationName(inputVal1, inputVal2, ... );
Or, you can pass the return values directly to a function, such
as the WriteOutput function, as the following example
shows:
writeoutput(webServiceName.operationName(inputVal1, inputVal2, ...) );
Access a web service from CFScriptCreate a ColdFusion page with
the following content:
<cfscript>
ws = CreateObject("webservice",
"http://www.xmethods.net/sd/2001/TemperatureService.wsdl");
xlatstring = ws.getTemp("55987");
writeoutput(xlatstring);
</cfscript>
Save the page as wscfscript.cfm in your web root directory.
View the page in your browser.
You can also use named parameters to pass information to a web
service. The following example performs the same operation as the
preceding code, except that it uses named parameters to make the
web service request:
<cfscript>
ws = CreateObject("webservice",
"http://www.xmethods.net/sd/2001/TemperatureService.wsdl");
xlatstring = ws.getTemp(zipcode = "55987");
writeoutput("The temperature at 55987 is " & xlatstring);
</cfscript>
Consuming web services that ColdFusion does not generateTo
consume a web service that is implemented in a technology other
than ColdFusion, the web service must have one of the following
sets of options:
The following example shows a portion of the WSDL file for the
TemperatureService web service:
<binding name="TemperatureBinding" type="tns:TemperaturePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getTemp">
<soap:operation soapAction=""/>
<input>
<soap:body use="encoded" namespace="urn:xmethods-Temperature" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods-Temperature" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
The WSDL file for the TemperatureService web service is compatible
with ColdFusion because it uses rpc as the binding style, and encoding
as the encodingStyle.
Calling web services from a Flash clientThe Flash Remoting service
lets you call ColdFusion pages from a Flash client, but it does
not let you call web services directly. To call web services from
a Flash client, you can use Flash Remoting to call a ColdFusion
component that calls the web service. The Flash client can pass
input parameters to the component, and the component can return
to the Flash client any data returned by the web service.
For more information, see Using the Flash Remoting Service.
Catching errors when consuming web servicesDuring processing, you can catch in
your application errors, including SOAP faults, that otherwise propagate
to the browser.
To catch errors, you specify an error type of application to
the ColdFusion cfcatch tag, as the following example
shows:
<cftry>
Place your application code here ...
<cfcatch type="application">
<!--- Add exception processing code here ... --->
</cfcatch>
...
<cfcatch type="Any">
<!--- Add exception processing code appropriate for all other
exceptions here ... --->
</cfcatch>
</cftry>
For more information on error handling, see Handling Errors.
Handling inout and out parametersSome web services define inout and out
parameters. You use out parameters to pass a placeholder
for a return value to a web service. The web service then returns
its result by writing it to the out parameter. Inout parameters
let you pass a value to a web service and lets the web service return
its result by overwriting the parameter value.
The following example shows a web service that takes as input
an inout parameter containing a string and writes its results back
to the string:
<cfset S="foo">
<cfscript>
ws=createobject("webservice", "URLtoWSDL")
ws.modifyString("S");
</cfscript>
<cfoutput>#S#</cfoutput>
Even though this web service takes as input the value of S, because
you pass it as an inout parameter, you do not enclose it in number
signs.
Note: ColdFusion supports the use of inout and out
parameters to consume web services. However, ColdFusion does not
support inout and out parameters when creating web services for
publication.
Configuring web services in the ColdFusion AdministratorThe ColdFusion
Administrator lets you register web services so that you do not have
to specify the entire WSDL URL when you reference the web service.
Note: The first time you reference a web service,
ColdFusion automatically registers it in the Administrator.
For example, the following code references the URL to the TemperatureService WSDL
file:
<cfscript>
ws = CreateObject("webservice",
"http://www.xmethods.net/sd/2001/TemperatureService.wsdl");
xlatstring = ws.getTemp("55987");
writeoutput(xlatstring);
</cfscript>
If you register the TemperatureService web service in the Administrator
using (for example, the name wsTemp), you can then reference the
web service as follows:
<cfscript>
ws = CreateObject("webservice", "wsTemp");
xlatstring = ws.getTemp("55987");
writeoutput("wsTemp: " & xlatstring);
</cfscript>
Not only does registering the service in the Administrator enable
you to shorten your code, it lets you change a web service URL without
modifying your code. So, if the TemperatureService web service moves
to a new location, you only update the administrator setting, not
your application code.
For more information, see the ColdFusion Administrator online
Help.
Data conversions between ColdFusion and WSDL data typesA WSDL file defines the
input and return parameters of an operation, including data types.
For example, the TemperatureService web service contains the following
definition of input and return parameters:
<message name="getTempRequest">
<part name="zipcode" type="xsd:string"/>
</message>
<message name="getTempResponse">
<part name="return" type="xsd:float"/>
</message>
As part of consuming web services, understand how ColdFusion
converts WSDL defined data types to ColdFusion data types. The following
table shows this conversion:
ColdFusion data type
|
WSDL data type
|
numeric
|
SOAP-ENC:double
|
Boolean
|
SOAP-ENC:boolean
|
string
|
SOAP-ENC:string
|
array
|
SOAP-ENC:Array
|
binary
|
xsd:base64Binary
|
numeric
|
xsd:float
|
string
|
xsd:enumeration
|
date
|
xsd:dateTime
|
void (operation returns nothing)
|
|
struct
|
complex type
|
query
|
tns1:QueryBean (Returned by CFCs)
|
For many of the most common data types, such as string and numeric,
a WSDL data type maps directly to a ColdFusion data type. For complex
WSDL data types, the mapping is not as straight forward. In many
cases, you map a complex WSDL data type to a ColdFusion structure.
For more information on handling complex data types, see Handling complex data types.
Consuming ColdFusion web servicesYour application
can consume web services created in ColdFusion. You do not have
to perform any special processing on the input parameters or return
values because ColdFusion handles data mappings automatically when
consuming a ColdFusion web service.
For example, when
ColdFusion publishes a web service that returns a query, or takes
a query as an input, the WSDL file for that service lists its data
type as QueryBean. However, a ColdFusion application consuming this
web service can pass a ColdFusion query object to the function as
an input, or write a returned QueryBean to a ColdFusion query object.
The following example shows a ColdFusion component that takes
a query as input and echoes the query back to the caller:
<cfcomponent>
<cffunction name='echoQuery' returnType='query' access='remote'>
<cfargument name='input' type='query'>
<cfreturn #arguments.input#>
</cffunction>
</cfcomponent>
In the WSDL file for the echotypes.cfc component, you see the
following definitions that specify the type of the function input
and output as QueryBean:
<wsdl:message name="echoQueryResponse">
<wsdl:part name="echoQueryReturn" type="tns1:QueryBean"/>
</wsdl:message>
<wsdl:message name="echoQueryRequest">
<wsdl:part name="input" type="tns1:QueryBean"/>
</wsdl:message>
For information on displaying WSDL, see Producing WSDL files.
Since ColdFusion automatically handles mappings to ColdFusion
data types, you can call this web service as the following example
shows:
<head>
<title>Passing queries to web services</title>
</head>
<body>
<cfquery name="GetEmployees" datasource="cfdocexamples">
SELECT FirstName, LastName, Salary
FROM Employee
</cfquery>
<cfinvoke
webservice = "http://localhost/echotypes.cfc?wsdl"
method = "echoQuery"
input="#GetEmployees#"
returnVariable = "returnedQuery">
<cfoutput>
Is returned result a query? #isQuery(returnedQuery)# <br><br>
</cfoutput>
<cfoutput query="returnedQuery">
#FirstName#, #LastName#, #Salary#<br>
</cfoutput>
</body>
|
|
|