2009-11-12 3 views
0

Я пытаюсь использовать всемирный веб-сервис AXIS2 SOAP с помощью PHP-клиента. Класс Java написан в Netbeans, и AAR-файл AXIS2 создается с использованием плагина Netbeans AXIS2.Могу ли я заставить Axis2 генерировать WSDL с «развернутыми» типами?

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

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

WSDL-genereated по 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")."!"; 

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

Вот являются разделы типов, сообщений и PortType сгенерированной: 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> 

ответ

1

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

class soapHelloWebservice { 
    public function sayHello($username) { 
     $client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl"); 
     $parameters["username"] = $username; 
     return $client->sayHello($parameters)->return; 
    } 
} 
1

Это называется документ/литерал завернутого узор. См. this document и this one.

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

0

При генерации клиентского кода с помощью инструмента wsdl2java командной строки (в комплекте с Axis2), добавьте параметр «-uw» разворачивать параметр, то есть вместо того, чтобы устанавливать параметры в бобе, вы бы просто отправить их как параметры метода.

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

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