1

更新:我设法让这个东西工作!

事实证明,您需要在通话中发送安全票证才能获得正确的响应。我不知道为什么它在没有它的情况下在海报中起作用。还有一些其他参数是 ColdFusion 默认情况下显然不发送的。

这是一个工作电话:

<!---MyTicketValue is sent over from the SAML gateway--->
<cfset myTicket = #cookie.MyTicketValue#>

<!---here we set the XML for the POST--->
<cfsavecontent variable="APIxml"><qdbapi><ticket><cfoutput>#myTicket#</cfoutput></ticket><apptoken>c4abnsde36pse7hzurwvjjb4m</apptoken></qdbapi></cfsavecontent>

<!---and this is the post with all necessary headers (don't ask me why they're needed)--->
<cfhttp url="https://workplace.intuit.com/db/main" method="POST" result="objGet">
  <cfhttpparam type="header" name="Accept-Encoding" value="gzip,deflate"/>
  <cfhttpparam type="header" name="Keep-Alive" value="115" />
  <cfhttpparam type="header" name="QUICKBASE-ACTION" value="API_GetUserInfo" />
  <cfhttpparam type="header" name="Content-Type" value="application/xml; charset=UTF-8" />
  <cfhttpparam type="body" value="#APIxml#" />
</cfhttp>

这将返回来自 Intuit Workplace 的完美响应。


我正在尝试使用 Coldfusion 向 Intuit 的 API 发送调用。必须将调用发布给他们(通过 SAML 网关)。必须在标头中提供令牌。

我真的没有使用 cfhttp 的经验,并且对整个 API 调用情况完全感到困惑。我需要一些非常基本的帮助。

基本上,如何格式化 cfhttp 标记,以便可以在标头中包含此标记?

<cfxml variable="API_GetUserInfo">

<qdbapi>
   <apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken>
   <email>email@hotmail.com</email>
</qdbapi>

</cfxml>


<cfhttp
  url="https://workplace.intuit.com/db/main"
  method="POST"
  result="objGet">

  <cfhttpparam
    type="header"
    name="Header"
    value="QUICKBASE-ACTION:API_GetUserInfo" 
  />

  <cfhttpparam
    type="xml"
    name="API_GetUserInfo"
    value="#API_GetUserInfo#"
  />

</cfhttp>

后来,我尝试了 Firefox 的海报插件。

我可以让电话正常工作,但是当我尝试在 CF 中复制它时,我仍然无法得到响应。

这是更新的代码:

<cfhttp url="https://workplace.intuit.com/db/main" method="POST" result="objGet" >

<cfhttpparam type="header" name="QUICKBASE-ACTION" value="API_GetUserInfo" />

<cfhttpparam type="formfield" name="xml" value="#API_GetUserInfo#" />

</cfhttp>

在海报中,这就是我要输入的内容:

网址:https ://workplace.intuit.com/db/main

内容类型:xml

内容:

<qdbapi>
  <apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken>
  <email>jimmyhogoboom@gmail.com</email>
</qdbapi>

和 1 个标题:

名称: QUICKBASE-ACTION

值:API_GetUserInfo

通过这些设置,我得到了正确的响应。

关于我在冷融合代码上做错了什么的任何想法?

4

2 回答 2

3

只是浏览一下 intuit sdk 页面,如果您有访问权限,似乎有一个PHP 开发工具包可用。我会围绕它进行的 HTTP 调用来了解如何在 ColdFusion 中构建类似的调用。因为您说“已发布”,所以您通常会为第二个 cfhttpparam 标记使用 FormField 的类型,因为使用 XML 的类型会更改请求的结构和内容类型。

我还注意到他们站点上的Java SAML 网关,您可以将 war 文件添加到您的站点并直接从您的 ColdFusion 代码调用 Java api。

于 2010-06-18T19:22:12.153 回答
3

知道了。您需要用 ToString 包装您的 XML。它将 XML 声明放在 XML 的开头,以使其成为有效的 XML 文档。我只是在我的最后尝试了它并且它有效。

<cfhttpparam
    type="xml"
    name="API_GetUserInfo"
    value="#ToString(API_GetUserInfo)#"
/>

由于上述方法不起作用,我尝试了其他几件事,这就是我所在的位置。我使用 Fiddler 来监控 Poster 发出的 HTTP 请求,我们知道这是一个很好的请求,这里是请求标头:

POST https://workplace.intuit.com/db/main HTTP/1.1
Host: workplace.intuit.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
QUICKBASE-ACTION: API_GetUserInfo
Content-Type: application/xml; charset=UTF-8
Content-Length: 109
Cookie: scache=Jun  3 2010 18:30:57_3; ptest=1277297927934; stest=1277298582509
Pragma: no-cache
Cache-Control: no-cache

<qdbapi>
  <apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken>
  <email>jimmyhogoboom@gmail.com</email>
</qdbapi>

我尝试的下一件事是尽可能多地模仿请求,但它仍然没有返回 XML。您会注意到一些变化是使用 CFSAVECONTENT 来摆脱 XML 声明并添加一些标头和 cookie 属性来尝试模拟海报请求:

<cfsavecontent variable="API_GetUserInfo"><qdbapi>
    <apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken>
    <email>jimmyhogoboom@gmail.com</email>
</qdbapi></cfsavecontent>

<cfhttp url="https://workplace.intuit.com/db/main" method="POST" result="objGet" useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)">
    <cfhttpparam type="header" name="Accept" value="application/xml" />
    <cfhttpparam type="header" name="Accept-Language" value="en-us,en" />
    <cfhttpparam type="header" name="Accept-Charset" value="utf-8" />
    <cfhttpparam type="header" name="Keep-Alive" value="115" />
    <cfhttpparam type="header" name="Connection" value="keep-alive" />
    <cfhttpparam type="header" name="QUICKBASE-ACTION" value="API_GetUserInfo" />
    <cfhttpparam type="header" name="Content-Type" value="application/xml; charset=UTF-8" />
    <cfhttpparam type="cookie" name="scache" value="Jun  3 2010 18:30:57_3" />
    <cfhttpparam type="cookie" name="ptest" value="1277297927934" />
    <cfhttpparam type="cookie" name="stest" value="1277298582509" />
    <cfhttpparam type="header" name="Pragma" value="no-cache" />
    <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
    <!---<cfhttpparam encoded="no" type="formfield" name="" value="#API_GetUserInfo#" />--->
    <cfhttpparam type="body" value="#API_GetUserInfo#" />
</cfhttp>

CFHTTP 没有按预期翻译某些属性,我只是不确定它是哪一个。也许第二双眼睛会有所帮助。可能必须直接使用 CreateObject 和 Java(java.net 类)来执行 HTTP 请求并绕过 CFHTTP 以及它添加到 HTTP 请求中导致其失败的每个奇怪的默认值。

于 2010-06-22T02:39:13.940 回答