POST вызов API xml (для Intuit) с использованием Coldfusion - PullRequest
1 голос
/ 18 июня 2010

ОБНОВЛЕНИЕ: Мне удалось заставить эту штуку работать!

Оказывается, вам НУЖНО отправить защищенный билет с вызовом, чтобы получить правильный ответ. Я понятия не имею, почему это работало в Афише без этого. Есть еще пара параметров, которые 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.


Я пытаюсь отправить вызов API Intuit с помощью Coldfusion. Вызов должен быть отправлен им (через шлюз 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>

Позже я попробовал дополнение Poster для 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?

Ответы [ 2 ]

3 голосов
/ 22 июня 2010

Понял. Вам нужно обернуть свой XML в ToString. Он поместит объявление XML в начале XML, чтобы сделать его действительным документом XML. Я просто попробовал это на моем конце, и это сработало.

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

Поскольку вышеприведенное не сработало, я попробовал несколько других вещей, и вот где я нахожусь. Я использовал Fiddler для мониторинга HTTP-запросов, которые делает Poster, и мы знаем, что это хороший запрос, а вот заголовок запроса:

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 для имитации запроса Poster:

<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-запрос, чтобы вызвать его сбой.

3 голосов
/ 18 июня 2010

Просто перелистывая страницу intuit sdk, похоже, что PHP dev kit доступен, если у вас есть доступ. Я бы поэкспериментировал с HTTP-вызовом, который он дает, чтобы понять, как структурировать аналогичный вызов в ColdFusion. Поскольку вы говорите «POSTed», вы обычно используете тип FormField для второго тега cfhttpparam, поскольку использование типа XML изменяет структуру и тип содержимого запроса.

Я также заметил шлюз Java SAML на их сайте, что вы можете добавить файл war на свой сайт и вызывать API Java непосредственно из кода ColdFusion.

...