代码之家  ›  专栏  ›  技术社区  ›  Ricardo Marimon

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

  •  4
  • Ricardo Marimon  · 技术社区  · 14 年前

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

    1 回复  |  直到 14 年前
        1
  •  8
  •   Justin Garrick    13 年前

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

    我假设您正在使用wsdl2java创建客户端?如果您不能让这个工具以您喜欢的方式生成消息,那么您最好的办法就是以编程方式生成消息。 对于Axis2,您可以使用AXIOM API来实现这一点。看见 this link createOMElement ,可以选择传递名称空间前缀。因此,如果您的提供者需要它,那么您可以传递一个包含“imk 1”的字符串作为namespacePrefix参数。


    如果您最终以编程方式完成这项工作,并且只需要编写一个简单的客户机,那么我 强烈 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>