1

我远非 ColdFusion 或 XML 方面的专家,所以这可能是一个愚蠢的问题。但是有没有办法动态地构造 SOAP 事务的各个部分,也许是通过在事务本身中包含 CFML?我正在使用的 API 有一个“MultiQuery”,它允许在单个 SOAP 事务中运行许多简单的查询。我想使用此功能使用上一个网页提供的一堆唯一 ID 进行查询。我事先不知道需要将多少个 ID 添加到“MultiQuery”中,所以我的想法是将每个 ID 传递到包含“MultiQuery”的页面上的数组中,然后循环遍历数组(“allOfficers ") 来构建 SOAP 事务,如下所示:

<cfset queryOpen=HTMLEditFormat("<arr:string>")>
<cfset queryClose=HTMLEditFormat("</arr:string>")>
<soapenv:Body>
  <ser:MultiQuery>
     <ser:associationGuid>e1c095ca39af</ser:associationGuid>
     <ser:queries>
        <cfloop index="i" from="1" to="#arrayLen(allOfficers)#">
            <cfoutput>#queryOpen#</cfoutput>from Membership memb where memb.Owner='<cfoutput>#allOfficers[1]#</cfoutput>'<cfoutput>#queryClose#</cfoutput>
        </cfloop>
    </ser:queries>
  </ser:MultiQuery>
</soapenv:Body>

这当然行不通。当我只输出数组时,它会产生很好的输出,如下所示:

<arr:string>from Membership memb where memb.Owner='006e1c09-25f9-4178-86de-13c3e63200ce'</arr:string>

这正是我需要的 SOAP 信封格式。但同样,它不起作用——显然这是我试图使用的 cfloop,因为当我手动插入循环的输出时,SOAP 事务工作正常。

所以,如果有人能给我一些建议或让我指出正确的方向,我肯定会很感激。同样,我基本上是在尝试向 SOAP 事务动态添加内容。在此先感谢您的帮助!

更新:这是我用来尝试构建此 SOAP 请求的完整代码。谢谢大家的帮助!

<cfset queryOpen=HTMLEditFormat("<arr:string>")>
<cfset queryClose=HTMLEditFormat("</arr:string>")>

<cfloop index="i" from="1" to="#arrayLen(allOfficers)#">
<cfoutput>#queryOpen#</cfoutput>from Membership memb where memb.Owner='<cfoutput>#allOfficers[1]#</cfoutput>'<cfoutput>#queryClose#<br /></cfoutput>
        </cfloop>

<cfsavecontent variable="soapBody">
<cfoutput>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:imp="http://test.com/Services/Imports" xmlns:ser="http://test.com/Services" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<soapenv:Header>
  <imp:SessionIdentifier Id="#URL.sessionGuid#"/>
</soapenv:Header>
<soapenv:Body>
  <ser:MultiQuery>
     <ser:associationGuid>12345</ser:associationGuid>
     <ser:queries>
        <cfloop index="i" from="1" to="#arrayLen(allOfficers)#">
            <cfoutput>#queryOpen#</cfoutput>from Membership memb where memb.Owner='<cfoutput>#allOfficers[i]#</cfoutput>'<cfoutput>#queryClose#</cfoutput>
        </cfloop>
    </ser:queries>
  </ser:MultiQuery>
</soapenv:Body>
</soapenv:Envelope>
</cfoutput>
</cfsavecontent>

<cfhttp url="https://test.com/Live/Partner/ObjectService" method="post" useragent="#CGI.http_user_agent#">
<cfhttpparam type="header" name="SOAPAction" value="http://test.com/Services/IObjectService/MultiQuery" />
<cfhttpparam type="header" name="accept-encoding" value="no-compression" />
<cfhttpparam type="xml" name="soapenv" value="#trim(soapBody)#" /> 
</cfhttp>

<cfset soapBody = xmlParse(cfhttp.fileContent) />
<cfset soapBody = soapBody['s:Envelope']['s:Body'].MultiQueryResponse.MultiQueryResult.Objects.ArrayOfanyType.anyType.Fields />
<cfset keyValue = xmlSearch(soapBody,"//*[local-name()='KeyValueOfstringanyType']") />

然后我可以遍历 keyValue[] 来构建我的页面。上面显示的代码不起作用。当我取出 cfloop 并手动更换它时,它可以工作。所以我想我的问题是,如何向 SOAP 主体的查询部分添加更多查询?或者,这甚至是正确的方法吗?我不知道每个委员会有多少分会官员,在用户选择分会之前我也不知道他们的 GUID。

希望这是有道理的!再次感谢你的帮助!

4

2 回答 2

2

为什么不在<cfsavecontent>它周围放一个标签,然后将其转储到屏幕上以查看输出。

我在那里看不到任何<cfoutput>标签,但很难猜测它是作为文本还是 cfml 执行

于 2012-08-02T13:40:05.513 回答
1

您应该看到 Ben Nadel 关于使用 ColdFusion 和 CFHTTP 进行 SOAP Web 服务请求的帖子

另外,您为什么要进行大量查询?为什么不做一个?

<cfoutput>#queryOpen# from Membership memb where memb.Owner in (<cfqueryparam cfsqltype="cf_sql_integer" value="#arrayToList(allOfficers)#" list="true" > ) #queryClose#</cfoutput>
于 2012-08-02T04:26:47.300 回答