ColdFusionを使用してXML API呼び出し(Intuit用)を投稿する
-
28-09-2019 - |
質問
アップデート: 私はなんとかこのことを機能させることができました!
結局のところ、適切な応答を得るために、電話で安全なチケットを送信する必要があります。なぜそれがそれなしでポスターで機能したのか、私にはわかりません。 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の職場から完全な反応を返します。
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>
ポスターには、私が入っているものがあります:
URL: https://workplace.intuit.com/db/main
コンテンツタイプ:XML
コンテンツ:
<qdbapi>
<apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken>
<email>jimmyhogoboom@gmail.com</email>
</qdbapi>
1つのヘッダー:
名前:QuickBase-action
値:API_GETUSERINFO
これらの設定では、正しい応答が得られます。
ColdFusionコードで私が何をしているのかについてのアイデアはありますか?
解決
とった。 XMLをTostringで包む必要があります。 XML宣言をXMLの先頭に配置して、有効なXMLドキュメントにします。私は自分の側でそれを試したばかりで、それはうまくいきました。
<cfhttpparam
type="xml"
name="API_GetUserInfo"
value="#ToString(API_GetUserInfo)#"
/>
上記はうまくいかなかったので、私は他のいくつかのことを試しましたが、ここに私がいる場所があります。 Fiddlerを使用して、ポスターが私たちが知っていることが良いリクエストであることを示す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を返していません。変更されたことに気付くのは、XML宣言を取り除くためのCFSaveContentの使用と、ポスターリクエストをシミュレートしようとする多数のヘッダーと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は、予想どおりいくらかのプロパティを翻訳していません。それがどれであるかはわかりません。たぶん、2番目の目が役立つでしょう。 HTTP要求を実行してCFHTTPをバイパスするには、CreateObjectとJava(java.netクラス)を使用する必要がある場合があります。
他のヒント
Intuit SDKページの周りを突っ込んでいるだけで、 PHP開発キット アクセスできる場合は利用できます。 ColdFusionで同様の呼び出しを構築する方法を理解するために、HTTPコールを突き破ります。あなたは「投稿」と言うので、通常、XMLのタイプを使用して、リクエストの構造とコンテンツタイプを変更するために、2番目のCFHTPPARAMタグにFormfieldのタイプを使用します。
私も気づきました Java Saml Gateway 彼らのサイトでは、あなたがあなたのサイトに戦争ファイルを追加し、あなたのコールドフュージョンコードからJava APIを直接電話することができるかもしれないということです。