cfcomponent web服务 - 获取SOAP属性

时间:2015-03-12 05:36:46

标签: web-services soap coldfusion

这是一个SOAP请求示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ws="http://ws_test">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:testService a1="a1" a2="a2">
         <ws:e1>e1</ws:e1>
         <ws:e2>e2</ws:e2>
      </ws:testService>
   </soapenv:Body>
</soapenv:Envelope>

这是我的示例cfc web服务:

<cfcomponent style="document" wsversion = 1>
    <cffunction name="testService" returntype="String" access="remote" >
        <cfargument type="string" name="e1"/>
        <cfargument type="string" name="e2"/>

        <!--- Missing: code to extract a1 and a2 --->   

        <cfreturn "#e1# #e2#">
    </cffunction>
</cfcomponent>

我是Coldfusion和网络服务的新手,我不知道如何从 <testService> <中提取属性 a1 a2 / strong>,谷歌搜索但无法找到任何参考。有什么想法吗?

===编辑===

如果我附上类型定义,可能会有用:

<complexType name="testServiceType">
    <sequence>
        <element name="e1" type="string"></element>
        <element name="e2" type="string"></element>
    </sequence>
    <attribute name="a1" type="string"/>
    <attribute name="a2" type="string"/>
</complexType>

请注意,虽然这是我的测试Web服务,但它基于我们的合作伙伴提供的数据架构,这意味着我的Web服务必须符合它。

===分辨率===

根据格里的回答,这就是我最终做的事情:

<cfcomponent style="document" wsversion = 1>
    <cffunction name="testService" returntype="String" access="remote" >
        <cfargument type="string" name="e1"/>
        <cfargument type="string" name="e2"/>

        <cfset soapReq = getSOAPRequest()>
        <cfset soapXML = xmlParse(soapReq)>
        <cfset attributes = soapXML.Envelope.body.XmlChildren[1].XmlAttributes>

        <cfset a1 = attributes.a1>
        <cfset a2 = attributes.a2>

        <cfreturn "#e1# #e2# #a1# #a2#">
    </cffunction>
</cfcomponent>

3 个答案:

答案 0 :(得分:1)

您只需要解析XML,然后获取a1和a2的值

<cfsavecontent variable="myXML" >
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws_test">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:testService a1="a1" a2="a2">
         <ws:e1>e1</ws:e1>
         <ws:e2>e2</ws:e2>
      </ws:testService>
   </soapenv:Body>
</soapenv:Envelope>
</cfsavecontent>
 <cfset parXML = xmlParse(myXML) />
<cfdump var="#parXML.Envelope.body.XmlChildren[1].XmlAttributes.a1#">

答案 1 :(得分:1)

根据你的评论,我认为你需要getSoapRequest(),然后使用keshav-jha给出的答案中的代码解析它

<cfcomponent style="document" wsversion = 1>

    <cffunction name="testService" returntype="String" access="remote" >
        <cfargument type="string" name="e1"/>
        <cfargument type="string" name="e2"/>
        <cfscript>
            soapReq=GetSOAPRequest();
            soapXML=xmlParse(soapReq);
            bodyAttributes = {
                a1:soapXML.Envelope.body.XmlChildren[1].XmlAttributes.a1
                ,a2:soapXML.Envelope.body.XmlChildren[1].XmlAttributes.a2
            };
            return serializejson(bodyAttributes);
        </cfscript>

    </cffunction>
</cfcomponent>

答案 2 :(得分:0)

如果您正在创建Web服务,那么您可以完全控制Web服务的使用方式。在这种情况下,a1和a2不会传递到CFC进行处理。因此,如果它们有意义,您可以将它们设置为e1和e2等参数。

我用来理解和使用网络服务的最佳工具之一是SoapUI。如果您创建example.cfc并指向它的SOAPUI,您将收到如下所示的XML请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.stack">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:testService>
         <soap:e1>e1</soap:e1>
         <soap:e2>e2</soap:e2>
      </soap:testService>
   </soapenv:Body>
</soapenv:Envelope>

如果要处理a1和a2,则没有理由不将它们作为常规参数处理。

所以你可以制作一个如下所示的CFC:

<cfcomponent style="document" wsversion = 1>

    <cffunction name="testService" returntype="String" access="remote" >
        <cfargument type="string" name="a1"/>
        <cfargument type="string" name="a2"/>
        <cfargument type="string" name="e1"/>
        <cfargument type="string" name="e2"/>


        <cfset var ret=serializeJSON(arguments) />
        <cfreturn "#ret#">
    </cffunction>
</cfcomponent>

如果你指向它的SOAPUI,那么它将生成一个如下所示的SOAP信封:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.stack">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:testService>
         <soap:a1>?</soap:a1>
         <soap:a2>?</soap:a2>
         <soap:e1>?</soap:e1>
         <soap:e2>?</soap:e2>
      </soap:testService>
   </soapenv:Body>
</soapenv:Envelope>