2010-03-22 3 views
4

Je viens de créer un client de service Web utilisant axis et eclipse qui ne fonctionne pas avec mon fournisseur de services Web. Le message créé par le client de service Web ressemble à ceci:Déplacer la déclaration d'espace de nom de la charge utile vers l'enveloppe sur un service Web créé par axe

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
    <enviarMensajeRequest 
     xmlns="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services"> 
     <usuario>someuser</usuario> 
     <clave>somepassword</clave> 
     <mensaje>somemessage</mensaje> 
     <contacto> 
     <buzonSMS>somenumber</buzonSMS> 
     <primerNombre>somefirstname</primerNombre> 
     <primerApellido>somelastname</primerApellido> 
     </contacto> 
    </enviarMensajeRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Je ne vois rien de mal avec le message mais mon fournisseur insiste sur le message doit être:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:imk="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services"> 
    <soapenv:Body> 
    <imk:enviarMensajeRequest> 
     <imk:usuario>someuser</imk:usuario> 
     <imk:clave>somepassword</imk:clave> 
     <imk:mensaje>somemessage</imk:mensaje> 
     <imk:contacto> 
      <imk:buzonSMS>somenumber</imk:buzonSMS> 
      <imk:primerNombre>somefirstname</imk:primerNombre> 
      <imk:primerApellido>somelastname</imk:primerApellido> 
     </imk:contacto> 
    </imk:enviarMensajeRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

Notez la déclaration d'espace de noms en mouvement de la enviarMensajeRequest à la soapenv:Envelope et la qualification avec imk: sur les paramètres. J'ai essayé beaucoup de combinaisons sur le processus mais mon service Web, connaissances de wsdl et de xml est très limité. Le fournisseur dit qu'ils ne peuvent pas m'empêcher de me dire ça. Des idées? Peut-être un cadre différent que je peux utiliser pour créer le bon client.

+0

Votre fournisseur est incorrect, ils sont sémantiquement identiques. L'Axe le sait et fait ce qu'il pense être le meilleur. Cela ne constitue pas un moyen facile de changer cela, car il n'y a pas de bonne raison de le faire. – skaffman

+0

Merci. Des idées sur la façon d'aborder cela en plus de faire l'appel entier à la main? – rmarimon

+1

@skaffman, merci pour votre réponse, mais est-il possible d'empêcher l'axe de faire comme ceci, sinon, je vais demander au fournisseur de serveur de corriger leur serveur. –

Répondre

8

Votre fournisseur a tort, les messages sont sémantiquement équivalents; le vôtre est non qualifié, le leur est qualifié. Utilisez-vous Axis ou Axis2? Si vous utilisez Axis, je vous suggère de passer à Axis2 pour une pile SOAP plus robuste et conforme aux normes (les deux produits sont mauvais, mais Axis2 est moins mauvais).

Je suppose que vous créez votre client avec wsdl2java? Si vous ne pouvez pas obtenir cet outil pour générer le message comme vous le souhaitez, alors votre meilleur pari est de générer le message par programmation. Avec Axis2, vous pouvez le faire avec l'API AXIOM. Voir this link pour un exemple d'utilisation de l'API. Notez qu'avec la plupart des méthodes, par ex. createOMElement, vous pouvez éventuellement passer le préfixe d'espace de noms. Donc, si votre fournisseur l'exige, vous pouvez passer une chaîne contenant "imk" comme paramètre namespacePrefix.


Si vous finissez par faire ce programme et vous allez seulement d'écrire un simple client, je FORTEMENT vous suggère d'abandonner l'approche Axe/Axis2 et utilisez la JAX-WS pile à la place, car il fait partie de Java depuis 1.6. L'API est plus propre et la documentation est meilleure. Par exemple, voici un client très simple que j'ai écrit pour envoyer une requête SOAP à notre serveur JIRA. L'exemple de code crée des éléments qualifiés et non qualifiés.

QName port = new QName(endpoint, "subversionsoapservice-v2"); 
QName serviceName = new QName(endpoint, "ISubversionSoapServiceService"); 

Service service = Service.create(serviceName); 
service.addPort(port, SOAPBinding.SOAP11HTTP_BINDING, endpoint); 

Dispatch<SOAPMessage> dispatch = service.createDispatch(port, SOAPMessage.class, Service.Mode.MESSAGE); 
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); 
SOAPMessage request = factory.createMessage(); 
SOAPBody body = request.getSOAPBody(); 

SOAPElement reindexRepository = body.addChildElement("reindexRepository", "jira", "http://soap.ext.plugin.jira.atlassian.com"); 
SOAPElement in0 = reindexRepository.addChildElement("in0"); 
in0.addTextNode("test"); 

request.saveChanges(); 
dispatch.invoke(request); 

Le XML envoyé par le client ressemble à ceci:

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <jira:reindexRepository xmlns:jira="http://soap.ext.plugin.jira.atlassian.com"> 
      <in0>test</in0> 
     </jira:reindexRepository> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+3

c'était super, merci. pour tout le monde, vous pouvez définir les déclarations d'espace de noms dans l'en-tête de savon comme suit: 'SOAPMessage request = factory.createMessage(); SOAPEnveloppe envelope = request.getSOAPPart(). GetEnvelope(); envelope.addNamespaceDeclaration ("uri", "uri: foo.bar.com"); request.saveChanges(); ' puis créez des éléments avec le préfixe d'espace de noms comme ceci: ' SOAPBody body = request.getSOAPBody(); SOAPElement ping = body.addChildElement ("foo", "uri"); ' – user326608

Questions connexes