Можно ли заставить Axis2 генерировать WSDL с «развернутыми» типами? - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь использовать веб-сервис AXIS2 SOAP hello world с помощью клиента PHP. Класс Java написан на Netbeans, а файл AXIS2 aar создается с помощью плагина Netbeans AXIS2.

Вы все видели это раньше, но вот класс Java:

public class SOAPHello {    
    public String sayHello(String username) {
        return "Hello, "+username;
    }  
}

Кажется, что wsdl, сгенерированный AXIS2, оборачивает все параметры, поэтому, когда я использую сервис, мне нужно использовать сумасшедший скрипт PHP, подобный этому:

$client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
$parameters["username"] = "Dave";
$response = $client->sayHello($parameters)->return;
echo $response."!";

Когда все, что я действительно хочу сделать, это

   echo $client->sayHello("Dave")."!";

Мой вопрос двоякий: почему это происходит? и что я могу сделать, чтобы остановить это? :)

Вот секции типов, сообщений и типов портов сгенерированного wsdl:

<wsdl:types>
   <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://soap.axis2.myhost.co.uk">
      <xs:element name="sayHello">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="username" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
      <xs:element name="sayHelloResponse">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
   </xs:schema>
</wsdl:types>

<wsdl:message name="sayHelloRequest">
   <wsdl:part name="parameters" element="ns:sayHello"/>
</wsdl:message>    
<wsdl:message name="sayHelloResponse">
   <wsdl:part name="parameters" element="ns:sayHelloResponse"/>
</wsdl:message>

<wsdl:portType name="SOAPHelloPortType">
   <wsdl:operation name="sayHello">
      <wsdl:input message="ns:sayHelloRequest" wsaw:Action="urn:sayHello"/>
      <wsdl:output message="ns:sayHelloResponse" wsaw:Action="urn:sayHelloResponse"/>
   </wsdl:operation>
</wsdl:portType>

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Это называется шаблоном документа / литерала. См. этот документ и этот.

По сути, при использовании кодировки документа / литерального запроса клиент не обязательно отправляет имя вызываемой им операции веб-службы. Сервер должен выяснить это из объекта запроса. Чтобы сервер мог это сделать, для каждой операции веб-службы определяется отдельный объект запроса.

1 голос
/ 08 февраля 2010

Я искал тот же вопрос и не нашел решения. Кажется, что это своего рода философия axis2 для создания такого дерьмового интерфейса, который я нахожу очень нечитаемым. Но я думаю, что для большинства целей вы бы просто приняли это. Если вам это не нравится и вы часто используете веб-сервис в своем приложении, напишите класс-оболочку, например:

class soapHelloWebservice {
   public function sayHello($username) {
      $client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
      $parameters["username"] = $username;
      return $client->sayHello($parameters)->return;
   } 
}
0 голосов
/ 24 ноября 2014

При создании клиентского кода с использованием инструмента командной строки WSDL2JAVA (в комплекте с Axis2) добавьте параметр ' -uw ', чтобы развернуть параметр, т. Е. Вместо установки параметров в bean-компоненте, вы бы просто отправьте их как параметры метода.

Мы постоянно используем это в нашем проекте.

...