Опубликовать вызов API XML (для Intuit), используя ColdFusion
-
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>
И это возвращает идеальный ответ от интуитивного рабочего места.
Я пытаюсь отправить призыв к 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>
Позже я попробовал постер добавить на 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. Некоторые вещи, которые вы заметите измененные, это использование 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 и какое каждый ronky default добавляет к http-запросу, чтобы заставить его выполнить неудачу.
Другие советы
Просто тыкать вокруг страницы Intuit SDK, похоже, есть PHP Dev kit. Доступно, если у вас есть доступ. Я бы покинул HTTP Call, это делает идею о том, как структурировать аналогичный вызов в ColdFusion. Поскольку вы говорите «Опубликовано», вы обычно используете тип Formfield для второго тега CFHTTPParam, поскольку используя тип XML, изменяет структуру и тип контента запроса.
Я также заметил Java Saml Gateway. На своем сайте, что вы сможете добавить файл War на свой сайт и вызовите Java API прямо из вашего кода ColdFusion.