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 ゲートウェイを介して) それらに POST する必要があります。ヘッダーでトークンを指定する必要があります。

私は 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>

そしてポスターには、ここに私が入力しているものがあります:

URL: https://workplace.intuit.com/db/main

コンテンツ タイプ: xml

コンテンツ:

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

および 1 つのヘッダー:

名前: QUICKBASE-ACTION

値: API_GetUserInfo

これらの設定により、正しい応答が得られます。

私がcoldfusionコードで間違っていることについて何か考えはありますか?

4

2 に答える 2

3

intuit sdk ページをざっと見てみると、アクセスできる場合はPHP 開発キットが利用できるようです。ColdFusion で同様の呼び出しを構成する方法を理解するために、HTTP 呼び出しを調べてみました。「POSTed」と言うので、XML のタイプを使用するとリクエストの構造とコンテンツ タイプが変わるため、通常は 2 番目の cfhttpparam タグに FormField のタイプを使用します。

また、サイトにJava SAML ゲートウェイがあり、サイトに war ファイルを追加して、ColdFusion コードから直接 Java API を呼び出すことができることに気付きました。

于 2010-06-18T19:22:12.153 に答える
3

とった。XML を ToString でラップする必要があります。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 は返されません。XML 宣言を取り除くために CFSAVECONTENT を使用し、Poster リクエストをシミュレートするためにいくつかのヘッダーと 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番目の目のセットが役立つでしょう. CreateObject と Java を直接 (java.net クラス) を使用して HTTP 要求を実行し、CFHTTP をバイパスし、HTTP 要求に追加されている不安定な既定値をバイパスして失敗させる必要がある場合があります。

于 2010-06-22T02:39:13.940 に答える