SOAP-вызов ColdFusion к API

Я слежу за страницами разработчиков RegOnline, чтобы настроить вызов API на наш сервер. Они предлагают различные примеры того, как рукопожатие (PHP, C#, JS, SOAP), последний имеет самый плохой пример того, как включить токен API как часть вызова метода.

http://developer.regonline.com/authentication-basics/

Я пытаюсь вызвать их метод GetEvent, и этот вызов должен включать созданный мной токен API . Однако, основываясь на их примере с SOAP, я догадываюсь, как включить значение токена. Вот их пример:

<s:complexType name="TokenHeader">
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="APIToken" type="s:string"/>
  </s:sequence>
  <s:anyAttribute/>
</s:complexType>

Другие примеры на странице имеют полные версии, которые явно показывают, где вы можете жестко запрограммировать токен, если вам нужно. Я признаю, что мои знания SOAP в настоящее время минимальны, поэтому, возможно, я что-то упустил в этом примере.

Вот моя попытка вызвать метод. Он выдает только страницу их документации и статус 200 OK, что неправильно.

<cfset apiToken = "xxxxx" />
<cfset eventID = "xxxxxx" />
    <cfsavecontent variable="soapBody">
        <cfoutput>

            <?xml version="1.0" encoding="utf-8"?>  
            <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">

                <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

                    <GetEvent xmlns="http://www.regonline.com/api">

                        <eventID>#eventID#</eventID>

                    </GetEvent>

                </s:Body>

            </s:Envelope>

            <s:complexType name="TokenHeader">
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="APIToken" type="s:string">
                        #apiToken#
                    </s:element>
                </s:sequence>
                <s:anyAttribute/>
            </s:complexType>

        </cfoutput>
    </cfsavecontent>

    <cfhttp url="https://www.regonline.com/api" method="get" result="theCFHTTP" redirect="true">

        <cfhttpparam type="HEADER" name="Content-Type" value="text/xml; charset=utf-8">
        <cfhttpparam type="HEADER" name="Accept" value="application/soap+xml, multipart/related, text/*">
        <cfhttpparam type="HEADER" name="User-Agent" value="Axis/1.1">
        <cfhttpparam type="HEADER" name="Cache-Control" value="no-cache">
        <cfhttpparam type="HEADER" name="Pragma" value="no-cache">
        <cfhttpparam type="HEADER" name="SOAPAction" value="https://www.regonline.com/api/default.asmx/GetEvent">
        <cfhttpparam type="HEADER" name="Content-Length" value="#len(soapBody)#">
        <cfhttpparam type="xml" name="body" value="#soapBody#">

    </cfhttp>

    <cfdump var="#theCFHTTP#">

person justacoder    schedule 04.04.2014    source источник


Ответы (2)


Это не то, что вы хотите сделать. При вызовах SOAP вы просто следуете XML-коду, предоставленному в документации (https://www.regonline.com/api/default.asmx?op=GetEvent).

Итак, в конкретном случае вы хотите заменить переменную CSSAVECONTENT soapBody ниже:

<cfsavecontent variable="soapBody">
<cfoutput>
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Header>
            <TokenHeader xmlns="http://www.regonline.com/api">
                <APIToken>#apiToken#</APIToken>
            </TokenHeader>
        </soap:Header>

        <soap:Body>
            <GetEvent xmlns="http://www.regonline.com/api">
                <eventID>#eventID#</eventID>
            </GetEvent>
        </soap:Body>
    </soap:Envelope>
</cfoutput>
</cfsavecontent>

Посмотрите, что это возвращает для вас.

person Chester    schedule 04.04.2014
comment
Не знаю, как я пропустил указанный вами URL-адрес документации, но это очень помогло. Вывод по-прежнему показывает только содержимое страницы документации, но эта проблема потребует отдельного сообщения. - person justacoder; 07.04.2014

Ваш SOAP-запрос имеет неправильный формат. Весь запрос SOAP должен находиться в конверте SOAP. Вот шаблон, созданный в SoapUI для запроса getEvent.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://www.regonline.com/api">
  <soapenv:Header>
    <api:TokenHeader>
      <!--Optional:-->
      <api:APIToken>?</api:APIToken>
   </api:TokenHeader>
  </soapenv:Header>
  <soapenv:Body>
    <api:GetEvent>
      <api:eventID>?</api:eventID>
    </api:GetEvent>
  </soapenv:Body>
</soapenv:Envelope>

Для самого звонка вам может потребоваться попробовать post вместо get, но я не уверен в этом. Единственное, что, я думаю, вам может понадобиться обновить, это SOAPAction. В моем тестовом вызове в SoapUI действие в заголовке было http://www.regonline.com/api/GetEvent. Хотя это может работать в обе стороны.

person Twillen    schedule 04.04.2014
comment
Ваше форматирование было точным, но некоторые теги — нет; хорошие догадки на тех, однако. - person justacoder; 07.04.2014