Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > создание SOAP-сообщения


Автор: check 13.6.2008, 21:29
Простой клиент для веб-сервиса средствами javax.xml.soap.

В ответ на посланное SOAP-сообщение Axis возвращает ошибку, в которой говорится об отсутствии header в моём SOAP. 
А он ведь вроде бы не обязательный? 

Пытаюсь создать header так
Код

SOAPEnvelope env = soapPart.getEnvelope();
SOAPHeader header = env.getHeader();
Name headerName = env.createName("actor", "wsi", "http://schemas.xmlsoap.org/soap/http");
SOAPHeaderElement headerElement = header.addHeaderElement(headerName);
header.addHeaderElement(headerName);

но по-прежнему возвращается та же ошибка.


вот код клиента
Код

    private static SOAPMessage getSOAPMessage()
            throws SOAPException {
        MessageFactory mf = MessageFactory.newInstance();
        SOAPMessage smsg = mf.createMessage();
        SOAPPart soapPart = smsg.getSOAPPart();
        SOAPEnvelope env = soapPart.getEnvelope();
        SOAPHeader header = env.getHeader();
        Name headerName = env.createName("actor", "wsi", "http://schemas.xmlsoap.org/soap/http");
        SOAPHeaderElement headerElement = header.addHeaderElement(headerName);
        header.addHeaderElement(headerName);
        SOAPBody body = env.getBody();
        Name element = env.createName("getEcho");
        SOAPBodyElement ge = body.addBodyElement(element);
        Name name = env.createName("request");
        SOAPElement req = ge.addChildElement(name);
        req.addTextNode("сообчение");

        return smsg;
    }

    public static void main(String[] args)
            throws SOAPException, MalformedURLException {
        SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
        SOAPConnection con = scf.createConnection();
        URL endpoint = new URL("http://localhost:8080/axis/EchoService.jws");
        SOAPMessage response = con.call(getSOAPMessage(), endpoint);
        con.close();

        SAAJResult result = new SAAJResult(response);


        SOAPPart sp = response.getSOAPPart();
        SOAPEnvelope respEnv = sp.getEnvelope();
        SOAPBody respBody = respEnv.getBody();
        SOAPFault fault = respBody.getFault();

        if (respBody.hasFault()) {
            fault = respBody.getFault();
            String code = fault.getFaultCode();
            String s = fault.getFaultString();
            String actor = fault.getFaultActor();

            System.out.println("Код ошибки: " + code);
            System.out.println("Разъяснение: " + s);
            if (actor != null) {
                System.out.println("Ошибка замечена: " + actor);
            }

            Detail detail = fault.getDetail();
            System.out.println("Детали: ");
            if (detail != null) {
               for (Iterator iter = detail.getDetailEntries(); iter.hasNext();) {
                   DetailEntry entry = (DetailEntry) iter.next();
                   String value = entry.getValue();
                   System.out.println(value);
               }
            }

        Iterator it = respBody.getChildElements();
        SOAPBodyElement bodyElement = (SOAPBodyElement) it.next();
        String echo = bodyElement.getValue();
        System.out.println(echo);



Вот что выдаёт
Код

Код ошибки: ns1:Client.NoSOAPAction
Разъяснение: no SOAPAction header!
Детали: 
[username]


Чего не хватает для формирования корректного SOAP?

Автор: check 13.6.2008, 22:45
Вот WSDL веб-сервиса
Код

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://localhost:8080/axis/EchoService.jws" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/EchoService.jws" xmlns:intf="http://localhost:8080/axis/EchoService.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->

   <wsdl:message name="getReverceEchoResponse">

      <wsdl:part name="getReverceEchoReturn" type="xsd:string"/>

   </wsdl:message>

   <wsdl:message name="getEchoRequest">

      <wsdl:part name="req" type="xsd:string"/>

   </wsdl:message>

   <wsdl:message name="getEchoResponse">

      <wsdl:part name="getEchoReturn" type="xsd:string"/>

   </wsdl:message>

   <wsdl:message name="getReverceEchoRequest">

      <wsdl:part name="req" type="xsd:string"/>

   </wsdl:message>

   <wsdl:portType name="EchoService">

      <wsdl:operation name="getEcho" parameterOrder="req">

         <wsdl:input message="impl:getEchoRequest" name="getEchoRequest"/>

         <wsdl:output message="impl:getEchoResponse" name="getEchoResponse"/>

      </wsdl:operation>

      <wsdl:operation name="getReverceEcho" parameterOrder="req">

         <wsdl:input message="impl:getReverceEchoRequest" name="getReverceEchoRequest"/>

         <wsdl:output message="impl:getReverceEchoResponse" name="getReverceEchoResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="EchoServiceSoapBinding" type="impl:EchoService">

      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="getEcho">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getEchoRequest">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>

         </wsdl:input>

         <wsdl:output name="getEchoResponse">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/EchoService.jws" use="encoded"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getReverceEcho">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getReverceEchoRequest">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>

         </wsdl:input>

         <wsdl:output name="getReverceEchoResponse">

            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/EchoService.jws" use="encoded"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="EchoServiceService">

      <wsdl:port binding="impl:EchoServiceSoapBinding" name="EchoService">

         <wsdlsoap:address location="http://localhost:8080/axis/EchoService.jws"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>


Автор: powerOn 14.6.2008, 01:11
Судя по сообщению об ошибке не хватает SOAPAction элемента. Вот http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528 о нем написано.

Автор: check 14.6.2008, 10:01
SOAPAction это MIME header,   значит добавляю его так
Код

SOAPPart soapPart = smsg.getSOAPPart();
soapPart.setMimeHeader("SOAPAction", "");  


Значение SOAPAction я устанавливаю пустым, потому что в моём WSDL оно такое.


Axis возвращает такую же ошибку: no SOAPAction header.
Сейчас гуглю на эту тему,  кажется это проблема специфична именно для Axis.  Надо попробовать обратиться таким же способом к какому-нибудь другому SOAP- серверу.

Естественно, когда я создаю клиент к этому веб-сервису средствами Axis, всё работает нормально.




Автор: xeye 15.6.2008, 13:03
извините, а в чем смысл ручного создания SOAP запроса? 
лучшие умы бьются над написанием библиотек, которые позволяют это не делать smile

Автор: check 15.6.2008, 17:25
Всё просто. У меня есть книга Ильдара Хабибуллина "Разработка Web-служб средствами Java".
Книга досталась мне на халяву(рекламная акция - купи любую книгу и возьми ещё одну в подарок)  smile  Поэтому я считаю своим долгом проштудировать её целиком.  А там рассматриваются разные средства и подходы к работе с WEB-сервисами и наверное, как это обычно бывает,  более низкоуровневые средства будут погибче.  Во всяком случае знать их не будет лишним.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)