Skip to main content
September 1, 2009
Answered

Consuming an ASP web service which responds with complex data types...

  • September 1, 2009
  • 1 reply
  • 1092 views

Here's my problem - I'm trying to consume a web service from a provider that uses complex data types.

The starting part of the WSDL looks like this (I've not included the whole thing) - named have been changed to protect the innocent:

<wsdl:definitions targetNamespace="http://domain_name">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://domain_name">
<s:element name="Authentication">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Token"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AuthenticateResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="AuthOK" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="Token"/>
</s:sequence>
</s:complexType>
</s:element>

Since it's a complexType return, with a sequence, I'd expect an array or structure returned, but instead I just get the "AuthOK" value, and no way to get anything else.

Here are the ways I've tried calling it:

<cfscript>

    WS = createObject("webservice", "https://WSDL_URL");

    WS_ret = WS.Authentication(Username = "username", Password = "password", Token = "");

</cfscript>

<cfdump var="#WS_ret#" />

<cfinvoke webservice="WSDL_URL" method="Authentication" returnVariable="WS_ret">

    <cfinvokeargument name="userID" value="7253320" />
    <cfinvokeargument name="password" value="ctpjxs3" />
    <cfinvokeargument name="SecurityToken" value="" />

</cfinvoke>

<cfdump var="#WS_ret#" />

Any ideas how I can get the other variables in the sequence? I have other calls after this that have a much larger amount of variables, and as such I can't use it without being about to get more of the

This topic has been closed for replies.
Correct answer JR__Bob__Dobbs-qSBHQ2

Thanks for the reply.

If I CFDUMP the variable it returns just "1", no XML tags, nothing at all around the data - according to the web service providers they say that they are supplying the Token part as long as the first variable is "1" (a logical true if the authentication passed). If it is "0" then no Token is returned, that is why it's optional.

As for the CFdocs issue, look here:

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=webservices_25.html

The paragraph before it (about 2/3 down the page) states:

In this example, the operation updateEmployeeInfo takes a complex type as input and returns a complex type as output. To handle the input parameter, you create a structure. To handle the returned value, you write it to a ColdFusion variable, as the following example shows:

It even states that you call "updateEmployeeInfo", and nowhere mentions "echoStruct" as a method - it's seemingly been put in as a random method name, or a function call for something else. The WSDL above the example only mentions "updateEmployeeInfo" and "updateEmployeeInfoSoapOut", again not mentioning "echoStruct".

I see this as an error in the docs as it's calling a non-existant entity in the WSDL, which should cause a run-time error.


You might try using the GetSOAPResponse function to examine the XML you are receiving.

"GetSOAPResponse"

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_e-g_59.html#5054378

"Troubleshooting SOAP requests and responses"

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=webservices_27.html#1222070

As for the docs issue I suspect poor editing is at fault. I suspect that the web service is assumed to have an echoStruct method but this is not clearly stated.

1 reply

September 1, 2009

Damn stupid thing cut off the end of my last paragraph...

Any ideas how I can get the other variables in the sequence? I have other calls after this that have a much larger amount of variables, and as such I can't use it without being about to get the other sequence entries.

Thanks in advance to anyone who can point me in the right direction...

BTW, please don't point me to the useless docs page, which is blatantly incorrect:

    ws = createObject("webservice", "http://somehost/echosimple.asmx?wsdl");
    myReturnVar = ws.echoStruct(stUser);

Saying to call "echoStruct" when trying to call the updateEmployeeInfo method? how the hell does that work???

Inspiring
September 2, 2009

Questions / Things to Check:

Can you post a dump of the WS_ret object ( I'm guessing this will be a struct) returned from the service?

Bear in mind that the definition Token element of AuthenticateResponse specifies that Token is optional.  Are you certain that you should be receiving this optional data?

I regards to the sample code you refer to:
ws = createObject("webservice", "http://somehost/echosimple.asmx?wsdl");
myReturnVar = ws.echoStruct(stUser);

The 'ws' variable is a reference to a web service object.  The 'ws.echoStruct' code is invoking the echoStruct method of the webservice and assigning the returned data to a CF variable 'myReturnVar'.

September 2, 2009

Thanks for the reply.

If I CFDUMP the variable it returns just "1", no XML tags, nothing at all around the data - according to the web service providers they say that they are supplying the Token part as long as the first variable is "1" (a logical true if the authentication passed). If it is "0" then no Token is returned, that is why it's optional.

As for the CFdocs issue, look here:

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=webservices_25.html

The paragraph before it (about 2/3 down the page) states:

In this example, the operation updateEmployeeInfo takes a complex type as input and returns a complex type as output. To handle the input parameter, you create a structure. To handle the returned value, you write it to a ColdFusion variable, as the following example shows:

It even states that you call "updateEmployeeInfo", and nowhere mentions "echoStruct" as a method - it's seemingly been put in as a random method name, or a function call for something else. The WSDL above the example only mentions "updateEmployeeInfo" and "updateEmployeeInfoSoapOut", again not mentioning "echoStruct".

I see this as an error in the docs as it's calling a non-existant entity in the WSDL, which should cause a run-time error.