0

我是 ColdFusion 的新手,需要编写代码来使用基于 SOAP 的 Web 服务。

任何使用具有复杂类型的基于 SOAP 的 Web 服务的链接/指针/示例都会有所帮助。

当我在 ColdFusion 中编写使用以下 Web 服务的代码时,我应该如何处理操作名称、输入 msg 和复杂类型?只需要一些指示即可开始。

XSD 类似于:

<!--  S Request -->
    <xs:complexType name="SRequestHeader">
     + <xs:sequence>
     + <xs:element name="sID" minOccurs="1" maxOccurs="1">   </xs:element>
     + <xs:element name="orderNumber" minOccurs="1" maxOccurs="1">   </xs:element>
     + <xs:element name="dateCreated" minOccurs="1" maxOccurs="1">   </xs:element>
    </xs:complexType>
  - <xs:complexType name="SOrderLine">
     - <xs:sequence>
     - <xs:element name="lineNumber" minOccurs="1" maxOccurs="1">   </xs:element>
     - <xs:element name="recordType" minOccurs="1" maxOccurs="1">   </xs:element>
     - <xs:element name="dueDate" minOccurs="1" type="xs:dateTime" />       
    </xs:complexType>
......

WSDL 有:

<WL:portType name="SPortType">
- <WL:operation name="newOrder">   
    <WL:input message="WL:newOrderRequest" name="newOrderRequest" />    
    <WL:output> message="W:newOrderResponse" name="newOrderResponse" />    
    <WL:fault> message="WL:WSException" name="WSException" />    
  </WL:operation>

我正在使用类似的东西:

<soapenv:Body>    
  <newOrder>
  <soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
      <sor:newOrderRequest>
         <sor:SOrderRequest>
            <sor:sID>S123</sor:sID> ....

最后...

<cfhttp url="http://xxxx:123/YYY/SService" method="post" timeout="118"        
       throwonerror="yes">
    <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>

在此行上出现500内部服务器错误:

<cfhttpparam type="xml" name="message" value="#trim(soap)#">
4

2 回答 2

2

您尚未共享完整的代码,因此必须做出一些假设。

Ben Nadel 就这个话题写了一篇精彩的文章。您绝对应该首先阅读:使用 ColdFusion 和 CFHTTP 制作 SOAP Web 服务请求

每当我与 SOAP 服务交互时,我通常最终都会使用类似于以下内容的内容。它与您共享的代码片段非常相似,但您没有显示(除其他外)包装在标签中的内容,以便在发出请求之前<cfsavecontent>将 XML 存储在变量中。这可能是你的问题?以下只是一个示例,可以帮助您进行操作。soap<cfhttp>

<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/1999/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <ns1:newOrder xmlns:ns1="urn:TripFlow" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <sID>001</sID>
         <orderNumber>12345</orderNumber>
         <dateCreated>07/31/2013</dateCreated>
      </ns1:newOrder>
   </soapenv:Body>
</soapenv:Envelope>
</cfsavecontent>

<!--- Invoke web service to send message--->
<cfhttp url="http://xxxx:123/YYY/SService" method="post" timeout="10">
<cfhttpparam type="header" name="content-type" value="text/xml" />
<cfhttpparam type="header" name="SOAPAction" value="""SService-method-name-here""" />
<!---<cfhttpparam type="header" name="accept-encoding" value="no-compression" />  sometimes this is needed --->
<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> 

使用 Web 服务时另一个非常宝贵的工具是soapUI。这绝对应该是你工具包的一部分。您可以使用soapUI 构建您的请求并检查响应。一旦你让它与soapUI一起工作,你就可以将你的请求复制到你的ColdFusion代码中。

于 2013-07-31T13:21:35.333 回答
0

谢谢@Miguel-F。终于使用了 SOAPUI 并了解出了什么问题。

设置了参数 throwonerror="Yes" 。因为这个 ParseException 会出错块而不是在代码中被捕获。

在设置 throwonerror="No" 时,代码终于开始工作并读取响应标签。

于 2013-08-02T12:02:41.243 回答