Web services 在axis创建的web服务上将命名空间声明从有效负载移动到信封

Web services 在axis创建的web服务上将命名空间声明从有效负载移动到信封,web-services,axis,Web Services,Axis,我刚刚使用axis和eclipse创建了一个web服务客户机,它与我的web服务提供商不兼容。web服务客户端创建的消息如下所示: <?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:

我刚刚使用axis和eclipse创建了一个web服务客户机,它与我的web服务提供商不兼容。web服务客户端创建的消息如下所示:

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

某个用户
密码
消息
一些
名字
姓氏
我认为这条消息没有什么问题,但我的提供商坚持认为这条消息应该是:

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

某个用户
密码
消息
一些
名字
姓氏

请注意,名称空间声明从
enviramensajerequest
移动到
soapenv:Envelope
以及参数上带有
imk:
的限定。我在这个过程中尝试了许多组合,但我的web服务、wsdl和xml知识非常有限。服务提供商说他们除了告诉我这件事之外帮不了我。有什么想法吗?也许我可以使用另一个框架来创建正确的客户端。

您的提供者是错误的,消息在语义上是等价的;你的不合格,他们的合格。您使用的是Axis还是Axis2?如果您使用的是Axis,我建议您切换到Axis2,以获得更健壮、符合标准的SOAP堆栈(这两种产品都不好,但Axis2不那么差)

我假设您正在使用wsdl2java创建客户机?如果您无法使用此工具以您喜欢的方式生成消息,那么最好是以编程方式生成消息。 对于Axis2,您可以使用AXIOM API实现这一点。有关API使用的一些示例,请参见。请注意,对于大多数方法,例如,您可以选择传递名称空间前缀。因此,如果您的提供商需要它,那么您可以传递一个包含“imk 2”的字符串作为namespacePrefix参数


如果您最终以编程方式完成这项工作,并且只打算编写一个简单的客户端,那么我强烈建议您放弃Axis/Axis2方法,改用堆栈,因为它是Java自1.6以来的一部分。API更干净,文档也更好。例如,下面是我编写的一个非常简单的客户端,用于向JIRA服务器发送SOAP请求。示例代码创建合格和不合格的元素

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);
QName端口=新的QName(端点,“subversionsoapservice-v2”);
QName serviceName=新的QName(端点,“ISubversionSoapServiceService”);
Service=Service.create(serviceName);
addPort(端口,SOAPBinding.SOAP11HTTP_绑定,端点);
Dispatch Dispatch=service.createDispatch(端口,SOAPMessage.class,service.Mode.MESSAGE);
MessageFactory=MessageFactory.newInstance(SOAPConstants.SOAP\u 1\u 1\u协议);
SOAPMessage请求=factory.createMessage();
SOAPBody=request.getSOAPBody();
SOAPElement reindexRepository=body.addChildElement(“reindexRepository”,“jira”,“jira”)http://soap.ext.plugin.jira.atlassian.com");
SOAPElement in0=reindexRepository.addChildElement(“in0”);
in0.addTextNode(“测试”);
request.saveChanges();
调用(请求);
客户端发送的XML如下所示:

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

测试

您的提供者不正确,它们在语义上完全相同。Axis知道这一点,并做它认为最好的事情。它没有提供简单的方法来改变这一点,因为没有很好的理由。谢谢。除了手动完成整个通话之外,还有什么其他方法吗?@skaffman,谢谢你的回答,但是有没有办法阻止axis这样做,如果没有,我会让服务器提供商更正他们的服务器。这很好,谢谢。对于其他人,您可以在soap头中设置名称空间声明,如下所示:
SOAPMessageRequest=factory.createMessage();SOAPEnvelope信封=request.getSOAPPart().getEnvelope();addNamespaceDeclaration(“uri”,“uri:foo.bar.com”);request.saveChanges()
然后创建名称空间前缀如下的元素:
SOAPBody=request.getSOAPBody();SOAPElement ping=body.addChildElement(“foo”、“uri”)