我远非 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。
希望这是有道理的!再次感谢你的帮助!