Как вызвать этот метод веб-сервиса? - PullRequest
0 голосов
/ 13 июня 2011

Я не могу сосредоточиться на том, чтобы ссылаться на простой метод стороннего обслуживания. Вот фрагмент WSDL для этого метода:

<s:element name="PushRequest">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="LocationCode" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="PushRequestXml" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="PassPhrase" type="s:string"/>
        </s:sequence>
    </s:complexType>
</s:element>

Это пример запроса SOAP 1.1, сгенерированного веб-сервисом:

<?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:Body>
    <PushRequest xmlns="http://xxxx.yyyy.com/">
      <LocationCode>string</LocationCode>
      <PushRequestXml>string</PushRequestXml>
      <PassPhrase>string</PassPhrase>
    </PushRequest>
  </soap:Body>
</soap:Envelope>

Сначала я подумал, что это один аргумент сложного типа, поэтому я попробовал это:

ws = CreateObject("webservice", serviceURL);

push = {};
push["LocationCode"] = "xxx";
push["PushRequestXml"] = "yyy";
push["PassPhrase"] = "zzz";

responseXML = ws.PushRequest(push);

Но получил обычный ответ CF Web service operation PushRequest with parameters {{PushRequestXml={yyy},LocationCode={xxx},PassPhrase={zzz}}} cannot be found..

Затем я подумал, что, возможно, это не сложный аргумент (по крайней мере, он не имеет атрибута name в XML), а три разных аргумента:

ws = CreateObject("webservice", serviceURL);

responseXML = ws.PushRequest(LocationCode = "xxx", PushRequestXml = "yyy", PassPhrase = "zzz");

Результат тот же: Web service operation PushRequest with parameters {PushRequestXml={{PushRequestXml, yyy}},LocationCode={{LocationCode, xxx}},PassPhrase={{PassPhrase, zzz}}} cannot be found.

Есть идеи, как с этим обращаться? Скажите, пожалуйста, нужна ли дополнительная информация.

Я использую ACF9, веб-сервис предоставлен ASP.net

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 июня 2011

В итоге я использовал простой POST-форматирование исходного XML-кода для веб-службы и анализ XML-ответа вручную, как предложено в этом сообщении в блоге .

Также я попробовал wsdl2java, как было предложено в 3-й части этой серии блогов, но это мне не помогло - метод выглядел точно так, как ожидалось ранее:

public java.lang.String pushRequest(java.lang.String locationCode, java.lang.String pushRequestXml, java.lang.String passPhrase) throws java.rmi.RemoteException;

В результате я не нашел подходящего способа использования cfinvoke для моего веб-сервиса.

Итак, мой текущий код запроса выглядит следующим образом:

<cfsavecontent variable="SOAPXML">
<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:Body>
    <PushRequest xmlns="http://serviceurl.com/">
      <LocationCode>#LocationCode#</LocationCode>
      <PushRequestXml>#XMLFormat(Trim(PushRequestXml))#</PushRequestXml>
      <PassPhrase>#PassPhrase#</PassPhrase>
    </PushRequest>
  </soap:Body>
</soap:Envelope>
</cfoutput>
</cfsavecontent>

<cfhttp method="post" url="#ServiceURL#">
    <cfhttpparam type="header" name="SOAPAction" value="http://serviceurl.com/PushRequest" />
    <cfhttpparam type="xml" value="#Trim(SOAPXML)#" />
</cfhttp>

Сервис возвращает XML, поэтому его обработка не является проблемой.

0 голосов
/ 14 июня 2011

Я не гуру в WSDL, но, похоже, я помню, что автоматически сгенерированные WSDL обычно используют суффикс метода «Запрос» или «Ответ», поэтому вам может потребоваться просто вызвать «Push» вместо «PushRequest».

ws = CreateObject("webservice", serviceURL);

push = {};
push["LocationCode"] = "xxx";
push["PushRequestXml"] = "yyy";
push["PassPhrase"] = "zzz";

responseXML = ws.Push(push);

стоит выстрел.

0 голосов
/ 13 июня 2011

Вы пытались использовать CFBuilder и вставили serviceURL в Браузер служб (Показать веб-службы -> +), а затем щелкните правой кнопкой мыши, чтобы сгенерировать правильный вызов createObject ()?

Services Browser in CFBuilder 2

...