Переместите объявление пространства имен из полезной нагрузки в конверт на оси, созданной веб-службой - PullRequest
4 голосов
/ 23 марта 2010

Я только что создал клиент веб-службы, используя оси и затмения, которые не работают с моим поставщиком веб-услуг. Сообщение, созданное клиентом веб-службы, выглядит следующим образом:

<?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: на параметрах. Я перепробовал множество комбинаций в этом процессе, но мои знания о веб-сервисах, wsdl и xml очень ограничены. Поставщик говорит, что они не могут помочь, кроме как сказать мне это. Есть идеи? Возможно, другой каркас, который я могу использовать для создания правильного клиента.

1 Ответ

8 голосов
/ 03 мая 2011

Ваш провайдер не прав, сообщения семантически эквивалентны; ваш неквалифицирован, их квалифицирован. Вы используете Axis или Axis2? Если вы используете Axis, я предлагаю вам перейти на Axis2 для более надежного, совместимого со стандартами стека SOAP (оба продукта плохие, но Axis2 менее плохой).

Я полагаю, вы создаете свой клиент с помощью wsdl2java? Если вы не можете заставить этот инструмент генерировать сообщение так, как вам нравится, тогда вам лучше всего сгенерировать сообщение программно. С Axis2 вы можете сделать это с помощью AXIOM API. См. эту ссылку для примера использования API. Обратите внимание, что с большинством методов, например, createOMElement , вы можете передать префикс пространства имен. Поэтому, если ваш провайдер требует этого, вы можете передать строку, содержащую «imk», в качестве параметра namespacePrefix.


Если вы в конечном итоге делаете это программно и собираетесь писать только простой клиент, тогда я СИЛЬНО предлагаю вам отказаться от подхода Axis / Axis2 и использовать JAX-WS вместо стека, так как является частью Java начиная с 1.6. API чище, а документация лучше. Например, ниже приведен очень простой клиент, который я написал для отправки запроса SOAP на наш сервер JIRA. В примере кода создаются как квалифицированные, так и неквалифицированные элементы.

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