Coldfusion SOAP 请求预览

Posted

技术标签:

【中文标题】Coldfusion SOAP 请求预览【英文标题】:Coldfusion SOAP request preview 【发布时间】:2012-09-14 03:38:23 【问题描述】:

我需要使用 ColdFusion 8 使用 asp.net Web 服务并返回一个 XML 文件。

我能够与 asp.net 服务通信,但从服务返回一个错误,基本上说我传递的信息无效。

下面是我的代码:

<cfxml variable="soap">
<?xml version="1.0" encoding="UTF-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <soap:Body>
<cfoutput> <GetSession xmlns="#stagingurl#"></cfoutput>  
  <strApplicationKey>myappkey</strApplicationKey>
  <UID>myuserid</UID>
  <arrProperties>
    <Property>
      <Name>IP</Name>
      <Value>127.0.0.1</Value>
    </Property>
  </arrProperties>
  <arrRoles />
</GetSession>
</soap:Body>
</soap:Envelope>         
</cfxml>

<cfhttp url="#apiurl#" method="post" result="httpresponse" port="443">

  <cfhttpparam type="header" name="content-type" value="text/xml"> 
  <cfhttpparam type="header" name="SOAPAction" value="#mysoapaction#"> 
  <cfhttpparam type="header" name="content-length" value="#len(trim(soap))#"> 
  <cfhttpparam type="header" name="charset" value="utf-8">
  <cfhttpparam type="Body" value="#trim(soap)#" name="FileContent"/>  

</cfhttp>

<cfdump var="#GetHttpRequestData()#" label="Get Http Request Data" />

有没有办法预览正在发送的信息以确保 ColdFusion 确实在发送我的 XML/SOAP 请求?

我确实使用#GetHttpRequestData()# 返回了一些数据,并且在结构中,内容是“空字符串”,这就是我需要帮助的地方。这应该是空的吗?这对我来说是新的,但是,我想我希望传递给 asp.net 服务的信息会在那里。

仅供参考 - 我可以很好地看到 HTTP 和 SOAP 响应,我只是看不到请求信息。如何查看请求信息?

仍在尝试确定问题是出在我的一方还是他们的一方,此时需要收集事实。

【问题讨论】:

【参考方案1】:

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

我注意到的一件事是您将 XML 包装在 cfxml 标记中。我不确定这是否会影响您的请求。我通常将我的 XML 请求包装在 cfsavecontent 标记中。因此,您可以尝试像这样更改代码:

<cfsavecontent variable="soap">
<?xml version="1.0" encoding="UTF-8" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
   <cfoutput> <GetSession xmlns="#stagingurl#"></cfoutput>  
   <strApplicationKey>myappkey</strApplicationKey>
   <UID>myuserid</UID>
   <arrProperties>
     <Property>
       <Name>IP</Name>
       <Value>127.0.0.1</Value>
     </Property>
   </arrProperties>
   <arrRoles />
   </GetSession>
   </soap:Body>
</soap:Envelope>         
</cfsavecontent>

您的其余代码可以保持不变。

【讨论】:

@ Miguel-F -- 我也使用了这条路线,虽然没有语法错误,但 ASP.Net 服务返回我没有发送正确的信息。 (无效的 UID)即使当我输出正在发送的 XML 的格式时,它的格式也是正确的。这就是为什么我试图在它到达 ASP.Net 服务器之前查看实际从 CF 服务器发送的信息。我正在与我的 IT 人员一起安装 Fiddler 或 SOAPUI。 @Green067 - 我会说你在正确的轨道上安装了soapUI。它对于测试 Web 服务非常宝贵。从您的评论看来,呼叫正在运行,但该服务只是在抱怨传递的 UID。对我来说,这听起来像是收到了请求,解析了 XML,但无法识别传递的 UID。愚蠢的问题 - 您的代码中是否包含用 # 括起来的 ColdFusion 变量?喜欢这个&lt;UID&gt;#myuserid#&lt;/UID&gt; 我安装了 SOAPUI 并意识到客户端提供的文档包含错误的 XML。我使用了 SOAPUI 中提供的 XML,它立即起作用了。谢谢!【参考方案2】:

如果您使用的是 Windows(或手头有 Windows 机器),请安装 Fiddler 并启动它。它是一个默认侦听端口 8888 的代理,因此在您的 cfhttp 调用中,添加 proxyServer="127.0.0.1" 和 proxyPort="8888" 并再次运行您的请求。

刚刚注意到您正在使用端口 443,因此可能是 SSL。您可以启用 HTTPS 解密工具->Fiddler 选项->HTTPS 选项卡->解密 HTTPS 流量。然后您可能还需要import the Certificate that Fiddler uses into your keystore。

现在每个请求都将显示在 Fiddler 中,您可以使用右侧的请求和响应检查器查看服务器之间传递的确切数据(原始选项卡显示数据未更改)。这救了我很多次,现在是我标准工具包的一部分。

在您的特定情况下,您是否有理由不使用 CreateObject("webservice","http://....") 。我假设它不适用于基于 .Net 的网络服务?

此外,对 GetHttpRequestData() 的调用显示了您对测试页面发出的请求,而不是您对测试 Web 服务发出的 HTTP 调用。不幸的是,CFHTTP 不返回任何显示其使用的完整 HTTP 请求详细信息的结构。我认为这将是一个非常合理的功能请求,因为目前,您必须使用 fiddler 或 wireshark 之类的工具来查看发送的内容。

【讨论】:

感谢您迄今为止的帮助。仍在为如何做到这一点而挠头。正如我所说,我是 web 服务的新手。关于 CreateObject 方法的问题...这是否允许我发送和接收 XML 数据?在我第一次尝试时,调用返回错误。找不到 Web 服务。我使用了与以前相同的 .asmx 文件路径,所以我不确定我哪里出错了。 CreateObject 方法为您需要发送到 Web 服务的 XML 类型创建存根,它负责将您的数据结构转换为 XML。您需要为您的 Web 服务提供 WSDL 的 URL,以便 CreateObject 工作。此外,您能否在没有密码/SSL 警告的情况下在浏览器中获取 WSDL?如果你需要做类似的事情,那么 CF 也会有类似的麻烦。如果可以让 CreateObject 工作,那么 CFDump 新创建的对象并查看其上的方法,它们应该对应于 Web Service 上的方法【参考方案3】:

dot net 的简单问题是,它无法处理由coldfusion 创建的XML 文档。要将XML返回点网,转换成字符串格式(XMLvariable.Tostring)

HTTP 请求的参数应该是&lt;cfhttpparam type="Body" value="#trim(soap).ToString#" name="FileContent"/&gt;

【讨论】:

以上是关于Coldfusion SOAP 请求预览的主要内容,如果未能解决你的问题,请参考以下文章

Coldfusion CFHTTP 握手失败

在我的 ColdFusion 页面上为经过身份验证/登录的用户包含特定 jQuery 函数的最佳方式是啥?

Coldfusion Ajax请求转储不再在Chrome中呈现

Coldfusion - Firstdata 全球网关 - 需要帮助入门

使用 Coldfusion/Railo 向 Mailchimp API v3.0 发送 PUT 请求时出现 401 未经授权的错误

更改 CF9 中的 OnRequestEnd 行为(是 ColdFusion 9 错误 - 无法在 OnRequestEnd 中引用请求变量)