Coldfusion,使用肥皂和动态肥皂体xml调用Web服务

时间:2013-04-16 12:50:34

标签: xml web-services soap coldfusion

我需要从我的coldfusion应用程序调用HTTP web服务上的soap。这涉及用户提交表单(包含大量字段),然后代码应将所有这些信息传递给Web服务并获得一些响应。所以一直在研究原型。

我一直在通过这个论坛,已经看到很多代码片段,但不知何故似乎都在xml部分传递硬编码值,但我需要从变量传递值。当我尝试传递变量等时,代码不会将它们视为变量而是将其视为文本值。

我的网络服务调用代码是:

<cfsavecontent variable="soap"><?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope 
        xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://localhost:8500/Credit Card Soap Web Service"><!---1 this is the cfc location--->

 <!---Optional
    <soapenv:Header>
    <setInit>1</setInit>
    <!--- 2 header param --->
    </soapenv:Header>--->
    <soapenv:Body>
        <authorize soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >
        <!---3 cfc method name --->
            <name>#elemName.XmlText#</name>
            <address>1010 Pine St</address>
            <zip>110001</zip>
            <state>MO</state>
            <country>USA</country>
            <cardtype>Visa</cardtype>
            <cardnumber>123123123</cardnumber>
            <expiry>10-12-2020</expiry>
            <amount>50000</amount>
        </authorize>
       </soapenv:Body>
</soapenv:Envelope>
</cfsavecontent>


<cfhttp url="http://localhost:8500/Credit Card Soap Web Service/Credit Card Soap Web Service authorization.cfc" method="post">
    <cfhttpparam type="header" name="content-type" value="text/xml">
    <cfhttpparam type="header" name="SOAPAction" value="">
    <cfhttpparam type="header" name="content-length" value="#len(soap)#">
    <cfhttpparam type="header" name="charset" value="utf-8">
    <cfhttpparam type="xml" name="message" value="#trim(soap)#">
</cfhttp>


<cfdump var="#xmlparse(cfhttp.FileContent)#">

此时的网络服务只是返回传递给它的值。暂时尝试解决这个问题。

请注意代码:

>  <name>#elemName.Text#</name> 

>  <address>1010 Pine St</address>

两行的处理方式与实际值相同。 XmlText设置为上面的值,这不会从变量中选择值。

 <cfdump var="#xmlparse(cfhttp.FileContent)#"> 

打印:

  item XmlText  
key XmlText NAME 
XmlAttributes struct 
xmlns:soapenc http://schemas.xmlsoap.org/soap/encoding/  
xsi:type soapenc:string  


**value XmlText #elemName.XmlText#** 
XmlAttributes struct 
xmlns:soapenc http://schemas.xmlsoap.org/soap/encoding/  
xsi:type soapenc:string  

请告诉我这里我做错了什么。我是CF的新手,仍在改进我的基础知识。

另外,我如何将编码样式更改为“文档”

如果您需要我的更多信息,请与我们联系。

提前致谢

1 个答案:

答案 0 :(得分:1)

为了传递变量的值,您需要做的就是使用<cfsavecontent>标记包含<cfoutput>标记中包含的ColdFusion变量。像这样:

 <name><cfoutput>#elemName.XmlText#</cfoutput></name>

如果你有几个ColdFusion变量,你也可以将<cfoutput>标签放在包含它们的代码块周围,而不是放在每个单独的变量周围。像这样:

<soapenv:Body>
    <cfoutput>
        <authorize soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >
            <!---3 cfc method name --->
            <name>#elemName.XmlText#</name>
            <address>#elemAddress.XmlText#</address>
            <zip>#elemZip.XmlText#</zip>
            <state>#elemState.XmlText#</state>
            <country>#elemCountry.XmlText#</country>
            <cardtype>#elemCardType.XmlText#</cardtype>
            <cardnumber>#elemCardNumber.XmlText#</cardnumber>
            <expiry>#elemCardDate.XmlText#</expiry>
            <amount>#elemAmount.XmlText#</amount>
        </authorize>
    </cfoutput>
</soapenv:Body>

<cfhttpparam>标记中,您还应该根据soap变量的修剪长度来确定内容长度的逻辑。因为那是你传递的信息。将trim函数添加到content-length标头中。像这样:

<cfhttpparam type="header" name="content-length" value="#len(trim(soap))#">