Larry,
Thanks for the information.. It is just really disappointing.. I sat
down.. downloaded/installed 7.0 dev.. and got a simple call working..
and was all excited.. and jumping up and down.. then.. this.. out goes
the reason to upgrade to 7.0.. :(
In 7.0, I can pass elements-in-elements but can't pass in element based
on a complex..
i.e following Works..
<request>
<version> </version>
<item>
<quantity> </quantity>
</item>
</request>
Not.
<request>
<version> </version>
<something type="complexType"> </something>
</request>
oh.. also I can pass in a XML Object for the soapHeader.. so I was
hopping from some magical way of doing this.. but from looks of it
there is none.
Thanks for the direct post.. option.. I didn't even think about that.. I
was just gonna go back to the straight XML API.. stupid me..
--
Regards,
Lawrence B. Afrin, M.D. wrote:
> Umer --
>
> As inferred by Dave Watts, your problem is that ns:DetailLevelCodeType
> defines a complex datatype, not the simple
> strings defined by the other parameters. Thus, the service you are trying to
> talk to requires you pass a
> complex-within-complex datatype, and the reason you are having difficulty
> figuring out how to do this is that ColdFusion
> can't do it.
>
> Your problem is exactly the same problem I (and my developer Doug James) have
> been pestering the cf-talk list about over
> the last few weeks, though the context for our problem (interfacing CF to
> UDDI web services) has been different from
> yours. Regardless, ColdFusion has no way to map ColdFusion
> structures-within-structures to the type of
> element-within-element XML messages required by WSDLs that define
> complex-within-complex structures. Why Macromedia
> hasn't yet provided a way to pass CF XML document objects, rather than just
> CF structures, to web services requiring
> complex-within-complex input arguments......well, I don't know.
>
> When you define a ColdFusion structure, the structure's keys become the names
> of XML *attributes* which modify the XML
> root element of the web service input argument to which you are feeding the
> structure, and the value of each key becomes
> the value of that XML attribute. For example:
>
> <cfset find_business = structNew()>
> <cfset find_business.generic = "2.0">
>
> is equivalent to
>
> <find_business generic="2.0">
>
> But, if the WSDL requires this...
>
> <find_business>
> <generic>2.0</generic>
> </find_business>
>
> ......ah, now you're stuck, for this is a complex-within-complex definition
> within the WSDL, and there is no way to build
> a structure within CFMX 6.x (nor within CFMX 7, as it turns out) that will
> get translated by CF into the above XML
> snippet as the Axis engine is building the outgoing SOAP message. Basically,
> you can't set up a CF
> structure-within-structure that'll get mapped to an element-within-element
> XML structure to be sent as the body of the
> SOAP message going out to the web service. And if you try to build the input
> XML message yourself and specify the
> resulting XML document object as the input argument in a <cfinvoke>, CF will
> just auto-translate this document object
> into a structure -- which will be in the wrong format compared to how Axis,
> after parsing the WSDL, expects to see the
> input argument.
>
> Solution? Yes, there is one. Basically, you have to bypass CFMX's Axis web
> services package and all the niceties it
> provides you. You need to build your own SOAP input message, HTTP POST it to
> the target web service, and parse the SOAP
> output message, as follows:
>
> <cfhttp method="POST"
> url="path-to-the-web-service-NOTE-not-the-path-to-the-WSDL">
> <cfhttpparam type="Header" name="SOAPAction" value="#chr(34)##chr(34)#">
> <cfhttpparam type="XML" value='<?xml version="1.0" encoding="UTF-8"
> ?><Envelope
> xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><yourWSDL-compliantXMLinput
> messagegoeshere/></Envelope>'>
> </cfhttp>
> <cfif cfhttp.fileContent is not "Connection Failure">
> <cfset x = xmlparse(cfhttp.fileContent)>
> </cfif>
> <cfset soapoutputbody = x["soap:Envelope"]["soap:Body"]>
>
> Then you can dig deeper into the soapoutputbody XML document object to ferret
> out the return info you're really looking
> for.
>
> [Notes: (1) Depending on the web service you're tapping into, you may need to
> define the SOAPAction header as something
> other than the pair of double-quote marks shown above. (2) CFMX 6.0 won't
> suffice for this workaround. You need 6.1 or
> later, because it wasn't until 6.1 that the type="Header" and type="XML"
> attributes were added to the cfhttpparam tag,
> and these attributes are critical to making this workaround work.]
>
> The tough part to making this work is figuring out exactly what kind of a
> SOAP input message your target web service
> requires. Once you've got that figured out, doing the cfhttp and wading
> through an xmlparsing of the service's output
> is pretty straightforward.
>
> Doug and I recently brought this to Macromedia's attention, so we can hope
> that a 7.0 Updater, or 7.1, will correct this
> deficiency sometime within the next year or two.
>
> -- Larry Afrin
> Medical University of South Carolina
> [EMAIL PROTECTED]
>
>
>
>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Find out how CFTicket can increase your company's customer support
efficiency by 100%
http://www.houseoffusion.com/banners/view.cfm?bannerid=49
Message: http://www.houseoffusion.com/lists.cfm/link=i:4:195716
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54