【问题标题】:Move namespace declaration from payload to envelope on an axis created web service将命名空间声明从有效负载移动到轴创建的 Web 服务上的信封
【发布时间】:2010-03-22 21:28:40
【问题描述】:

我刚刚使用轴和 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" 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>

注意命名空间声明从enviarMensajeRequest 移动到soapenv:Envelope 以及参数上的imk: 限定。我在这个过程中尝试了很多组合,但我的 web 服务、wsdl 和 xml 知识非常有限。提供者说他们只能告诉我这个。有任何想法吗?也许我可以使用不同的框架来创建正确的客户端。

【问题讨论】:

  • 您的提供者不正确,它们在语义上是相同的。 Axis 知道这一点,并且会做它认为最好的事情。它没有提供简单的方法来改变这一点,因为没有充分的理由。
  • 谢谢。除了手动完成整个调用之外,关于如何解决这个问题的任何想法?
  • @skaffman,感谢您的回答,但是有什么办法可以防止轴这样做,如果没有,我会要求服务器提供商更正他们的服务器。

标签: web-services axis


【解决方案1】:

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

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


如果您最终以编程方式执行此操作并且您将只编写一个简单的客户端,那么我强烈建议您放弃 Axis/Axis2 方法并改用 JAX-WS 堆栈,因为自 1.6 以来,它就是 Java 的一部分。 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);

客户端发送的 XML 如下所示:

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

【讨论】:

  • 这太棒了,谢谢。对于其他人,您可以像这样在soap标头中设置命名空间声明:SOAPMessage request = factory.createMessage(); SOAPEnvelope envelope = request.getSOAPPart().getEnvelope(); envelope.addNamespaceDeclaration("uri", "uri:foo.bar.com"); request.saveChanges();,然后使用命名空间前缀创建元素,如下所示:SOAPBody body = request.getSOAPBody(); SOAPElement ping = body.addChildElement("foo", "uri");
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多