2010-06-18 2 views
1

UPDATE: Мне удалось получить эту работу!POST вызов API xml (для Intuit) с использованием Coldfusion

Оказывается, вам НЕОБХОДИМО отправить безопасный билет с вызовом, чтобы получить правильный ответ. Я понятия не имею, почему он работал в Poster без него. Есть пара других параметров, которые требуются, которые 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 protected]</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>[email protected]</email> 
</qdbapi> 

и 1 Заголовок:

Имя: QuickBase-ACTION

Значение: API_GetUserInfo

С этими настройками я получаю правильный ответ.

Любые идеи относительно того, что я делаю неправильно с кодом coldfusion?

+1

какой токен? c4abnsdepseds7hdzurwvjjb4m? в заголовке, в каком поле? возможно, захотят сначала протестировать свой API с помощью Плаката https://addons.mozilla.org/en-US/firefox/reviews/display/2691, а затем эмулировать тот же вызов с CFHTTP. – Henry

+0

спасибо. Я сделаю это. – Jimmy

+0

http://www.postbin.org/ также хорош для отладки – Sergii

ответ

2

Got it. Вам нужно обернуть свой 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>[email protected]</email> 
</qdbapi> 

Следующая вещь, которую я попытался было имитируя, как большая часть запроса, как я мог, но это все еще не возвращая XML. Некоторые вещи, которые вы замечаете изменились являются использование CFSAVECONTENT, чтобы избавиться от декларации XML и добавления нескольких заголовков и печенья свойств, чтобы попытаться имитировать запрос на e-mail:

<cfsavecontent variable="API_GetUserInfo"><qdbapi> 
    <apptoken>c4abnsdepseds7hdzurwvjjb4m</apptoken> 
    <email>[email protected]</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-запросу, чтобы вызвать его.

+0

Это все еще не работает для меня. :( – Jimmy

+0

Не могли бы вы уточнить? Когда я использовал ваш код как есть, я ничего не получил в CFHTTP.FileContent, но когда я использовал ToString, сайт вернул содержимое. –

+0

О да, извините. Я получаю контент обратно, но его отброс. Ответ, когда вызов выполняется правильно, должен быть xml с некоторой важной информацией. Ответ, который я получаю, это html (его фактически html для Workplace.Intuit.com). – Jimmy

3

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

Я также заметил на своем сайте Java SAML gateway, что вы можете добавить файл войны на свой сайт и вызвать Java api прямо из вашего кода ColdFusion.

+0

, ковыряющийся в наборе php dev, очень хорошая идея! это никогда не приходило мне в голову. Однако, я думаю, что моя основная проблема сейчас - синтаксис coldfusion. У меня есть идея, что я хочу сделать, у меня просто возникают проблемы с тем, чтобы сделать CF и делать это так, чтобы Intuit понимал. – Jimmy

+0

Я думаю, что если вы просто измените второй cfhttpparam на type = "formfield", как предполагает shooksm, вы можете быть на вашем пути. –

+0

К сожалению, это не помогло. Это дает мне тот же ответ. – Jimmy

Смежные вопросы