1

我正在尝试使用 Lucee 4.5 执行 CFHTTP 调用。我的主工作站上的测试代码没问题(运行 CF 10),但是当完全复制到带有 Lucee 的笔记本电脑时,如果失败并发送 400 错误无效标头。见下文

#XML Being Passed
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SOAP-ENV:Body>
    <m:Authenticate xmlns:m="http://foo.com/2005/">     
      <m:userName>xxxxx</m:userName>
      <m:password>xxxxx</m:password>
    </m:Authenticate>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


#Partial Codebase; 'variable' is XML posted above
<cfhttp url="http://xxxxxxx?WSDL" method="post" result="theCFHTTP" compression="false">
            <cfhttpparam type="HEADER" name="Content-Type" value="text/xml; charset=utf-8">
            <cfhttpparam type="HEADER" name="Accept" value="application/soap+xml, application/dime, multipart/related, text/*">
            <cfhttpparam type="HEADER" name="User-Agent" value="Axis/1.1">

            <cfhttpparam type="HEADER" name="Cache-Control" value="no-cache">
            <cfhttpparam type="HEADER" name="Pragma" value="no-cache">
            <cfhttpparam type="HEADER" name="SOAPAction" value="http://foo.com/2005/Authenticate">
            <cfhttpparam type="HEADER" name="Content-Length" value="#len(soap)#">
            <cfhttpparam type="xml" name="body" value="#soap#">
        </cfhttp>

我对 Lucee 很陌生,从未使用过 Railo,所以如果需要完成独特的字符集或其他配置选项,我将不胜感激。

编辑:进一步的测试已经确定我不能 CFHTTP 到笔记本电脑本身之外的任何页面。所有外部 URL 都会给出 400 错误标头消息。

我还添加了compression=false这样 Lucee 不会自动将 GZip 内容发送到请求 url。

我的工作机器的返回标题:

  • 字符集:utf-8
  • 标头:HTTP/1.1 200 OK 缓存控制:私有,max-age=0 内容类型:text/xml;charset=utf-8 服务器:Microsoft-IIS/8.0 X-AspNet-Version:4.0.30319 X-Powered-By:ASP.NET 日期:2015 年 3 月 25 日星期三 14:58:03 GMT 连接:关闭 内容长度: 603
  • 模仿类型:文本/xml

故障机器的返回标头:

  • 字符集:us-ascii
  • 标头:HTTP/1.1 400 错误请求内容类型:text/html;charset=us-ascii 服务器:Microsoft-HTTPAPI/2.0 日期:2015 年 3 月 25 日星期三 15:06:18 GMT 连接:关闭 内容长度:339
  • 模仿类型:文本/html

5月19日编辑:

我根据 Fabio 的响应在 CFHTTP 调用中分别测试了以下每个调整:

  1. 我删除了 Content-Type 标头参数,或者
  2. 将 body 参数从“xml”更改为“body”

两者都不起作用,尽管我的错误消息已更改为400 Bad Request。CFHTTP 调用的转储表明我正在发送无效的 XML,尽管独立检查验证它实际上是有效的。它在令牌身份验证调用中失败。

4

1 回答 1

1

我今天遇到了同样的问题。最后我得到了它!

我使用 tcpdump 嗅探网络流量,看起来我们对 IIS7 的请求包含两次Content-Type标头,从而导致丑陋

错误的请求 - 无效的标头名称错误

问题出在 body 参数中:

<cfhttpparam type="xml" name="body" value="#soap#">

Lucee 相应地将 Content-Type 标头设置为 text/xml;utf-8... 然后根据您的其他参数再次设置它:

<cfhttpparam type="HEADER" name="Content-Type" value="text/xml; charset=utf-8">

你有两个选择:

  1. 将 type="xml" 留给您的 cfhttpparam 标记,并删除显式 MIME+charset 参数
  2. 将 type="xml" 更改为type="body"并手动设置所有标题
于 2015-04-27T12:55:49.590 回答