使用Coldfusion发布xml API调用(用于Intuit)
更新:我设法得到这个东西工作!
事实证明,你需要发送一个安全的电话票,以获得适当的回应。 我不知道为什么它没有它在海报中起作用。 还有其他一些参数是必需的,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的Poster附加功能。
我可以让调用工作得很好,但是当我尝试在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
通过这些设置,我可以得到正确的回应。
任何想法,我在做什么错误的ColdFusion代码?
得到它了。 你需要用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请求中的每个默认默认值都会导致它失败。
只需在intuit sdk页面上打个盹,看起来好像有一个PHP开发工具包可用,如果您有权访问。 我会绕过它的HTTP调用来了解如何在ColdFusion中构建类似的调用。 因为您说“已发布”,所以通常会使用第二个cfhttpparam标记的FormField类型,因为使用XML类型会更改请求的结构和内容类型。
我还注意到他们的网站上有一个Java SAML网关,您可以将war文件添加到您的网站,并直接从您的ColdFusion代码调用Java API。
链接地址: http://www.djcxy.com/p/31219.html上一篇: POST an xml API call (for Intuit) using Coldfusion
下一篇: Evaluating Coldfusion directory path for file existence