2009-11-12 9 views
0

J'essaie de consommer un service web AXIS2 SOAP hello world en utilisant un client PHP. La classe Java est écrite dans Netbeans et le fichier aar AXIS2 est généré à l'aide du plugin Netbeans AXIS2.Puis-je faire en sorte que Axis2 génère un WSDL avec des types «déballés»?

Vous avez tous vu avant, mais voici la classe java:

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

Le wsdl genereated par AXIS2 semble envelopper tous les paramètres de sorte que lorsque je consomme le service que je dois utiliser un script PHP fou comme ceci:

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

Quand tout ce que je veux vraiment faire est

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

Mon q L'uestion est double: pourquoi cela se passe-t-il? et que puis-je faire pour l'arrêter? :)

Voici ce sont les types, le message et les sections portType du fichier WSDL généré:

<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> 

Répondre

1

je cherchais la même question et n'a pas trouvé une solution. Il semble que ce soit une sorte de philosophie axis2 pour générer ce genre d'interface merdique que je trouve très illisible. Mais je pense que pour le plus de buts, vous l'accepteriez. Si vous ne souhaitez pas utiliser le webservice et beaucoup dans votre application, puis d'écrire une classe wrapper comme ceci:

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

Ceci est appelé le document/modèle enveloppé littéral. Voir this document et this one.

Fondamentalement, lors de l'utilisation du codage de requête document/littéral, le client n'envoie pas nécessairement le nom de l'opération de service Web qu'il appelle. Le serveur doit le comprendre à partir de l'objet de requête. Pour garantir que le serveur peut le faire, un objet de requête différent est défini pour chaque opération de service Web.

0

Lors de la génération du code client à l'aide de l'outil de ligne de commande WSDL2Java (livré avec Axis2), ajoutez le paramètre « uw » à déballer le paramètre, à savoir au lieu de définir les paramètres d'un haricot, vous suffit de les envoyer comme paramètres de méthode.

Nous l'utilisons tout le temps dans notre projet.