Как передать несколько параметров через мыльный заголовок в Java? - PullRequest
0 голосов
/ 17 июня 2019

Я новичок в SOAP и пытаюсь получить некоторые данные из веб-службы SOAP.есть только один метод, который я могу вызвать непосредственно из WS, который хорошо работает с методами, сгенерированными (port, proxy, service ..) из файла WSDL, но для других методов, которые мне нужны, требуется заголовок аутентификации, подобный этому:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <AuthHeader xmlns="http://localhost/webservices/map2">
      <UserName>string</UserName>
      <Password>string</Password>
      <Secure>boolean</Secure>
    </AuthHeader>
  </soap:Header>

после некоторых исследований я нашел это решение с помощью SOAPHandler:

public boolean handleMessage(SOAPMessageContext context) {

        Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (isRequest) {

            try {
                SOAPMessage soapMsg = context.getMessage();
                SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
                SOAPHeader soapHeader = soapEnv.getHeader();

                if (soapHeader == null) {
                    soapHeader = soapEnv.addHeader();
                }

                // add a soap headers
                QName qnameAuthHeader = new QName("http://localhost/webservices/map2", "AuthHeader");

                SOAPHeaderElement soapAuthHeader = soapHeader.addHeaderElement(qnameAuthHeader);

                soapAuthHeader.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT);
                soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "UserName"), "user1");
                soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "Password"), "pass1");
                soapAuthHeader.addAttribute(new QName("http://localhost/webservices/map2", "Secure"), "false");


                soapMsg.saveChanges();

                // tracking
                soapMsg.writeTo(System.out);

            } catch (SOAPException e) {
                System.err.println(e);
            } catch (IOException e) {
                System.err.println(e);
            }

        }

        return true;
    }

, но когда я запускаю это

ServiceSoapProxy proxy = new ServiceSoapProxy("http://localhost/ws3.0/service.asmx?wsdl");
        ServiceSoap service = proxy.getServiceSoap();

Binding binding = ((BindingProvider) service).getBinding();

, я получаю это:

Exception in thread "main" java.lang.ClassCastException: localhost.webservices.map2.ServiceSoapStub cannot be cast to javax.xml.ws.BindingProvider
    at test.devs.MailiTest.main(MailiTest.java:33)

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Прочитав мою автоматически сгенерированную заглушку, я наконец понял и нашел решение своей проблемы.и этот ответ для тех, кто ищет то же самое, что и я.

Я только что добавил эту строку в метод createCall (), который находится в моем Stub.java:

setHeader("http://localhost/webservices/map2", "AuthHeader", new AuthHeader("username", "password"));
0 голосов
/ 18 июня 2019

Вы можете перейти по ссылке ниже для того же, она мне очень помогла во время реализации.

http://informatictips.blogspot.pt/2013/09/using-message-handler-to-alter-soap.html

http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client

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

    HttpPost httppost = new HttpPost(endPoint);
            StringEntity stringentity = new StringEntity(envBody, "UTF-8");
            stringentity.setChunked(true);
            httppost.setEntity(stringentity);
            httppost.addHeader("Accept", "text/xml");
            httppost.addHeader("Content-Type", "text/xml");
            httppost.addHeader("SOAPAction", soapAction);
            String authToken = Base64.encodeBytes("username"
                    + ":" + "password".getBytes());

            httppost.addHeader("Authorization", "Basic " + authToken);

            HttpClient httpclient = new DefaultHttpClient();
            HttpParams httpParams = httpclient.getParams();
            httpParams.setParameter("http.connection.timeout",
                    Integer.valueOf(60000));
            httpParams.setParameter("http.socket.timeout", Integer.valueOf(60000));

            HttpResponse response = null;
            try {
                response = httpclient.execute(httppost);
            } catch (Exception e) {
                log.error(e);
                e.printStackTrace();
            }

            HttpEntity entity = response.getEntity();
            return EntityUtils.toString(entity);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...