SOAP Заголовок простой вызов - PullRequest
0 голосов
/ 25 мая 2018

Я тестирую веб-сервис, который я импортировал через wsimport. WSDL - это простой веб-сервис с такой структурой:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
   <soap:Header>
      <tem:authUser>
         <!--Optional:-->
         <tem:userName></tem:userName>
         <!--Optional:-->
         <tem:password></tem:password>
         <!--Optional:-->
         <tem:authenticationToken></tem:authenticationToken>
      </tem:authUser>
   </soap:Header>
   <soap:Body>
      <tem:authenticateUser/>
   </soap:Body>
</soap:Envelope>

Дело в том, что у меня есть некоторые проблемы при вызове этого веб-сервиса со следующим кодом из-за параметров заголовка, I

public static void main(String[] args) {
	// write your code here
        System.out.println("Hello world");

        WsTest wsTEST = new WsTest();
        WsTestSoap client = wsTest.getWsTestSoap();

        Map<String,Object> request = ((WSBindingProvider) client).getRequestContext();
        Map<String,List<String>> headers = new HashMap<String, List<String>>();

        headers.put("userName", Collections.singletonList("xxxxx"));
        headers.put("password", Collections.singletonList("xxxxx"));
        request.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

        String re1 = client.authenticateUser();
        String re2 = client.existencias("xxxx");
        
        System.out.println(re1);
        System.out.println(re2);

    }

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

Это мой ответ:

Hello world
Authentication Error
Authentication Error

Process finished with exit code 0

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 26 мая 2018

вот решение ...

package com.company;


import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import java.util.Collections;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AuthenticationHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public Set<QName> getHeaders() {
        return Collections.EMPTY_SET;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        SOAPMessage msg = context.getMessage();
        try {
            if((Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)){
                //System.out.println("Intercepting outbound message");

                SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
                envelope.addNamespaceDeclaration("tem","http://tempuri.org/");
                if(envelope.getHeader() != null){
                    envelope.getHeader().detachNode();
                }

                SOAPHeader header = envelope.addHeader();
                SOAPHeaderElement element = header.addHeaderElement(envelope.createName("authUser","tem","http://tempuri.org/"));


                SOAPElement userName = element.addChildElement("userName","tem");
                userName.setTextContent("xxxxx");

                SOAPElement password = element.addChildElement("password","tem");
                password.setTextContent("xxxxx");

                msg.saveChanges();
                //msg.writeTo(System.out);
            }

        } catch (Exception ex) {
            Logger.getLogger(AuthenticationSFEHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
        return true;
}

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public void close(MessageContext context) {
    }
}
...