Consumir WebService do PortalTUI

Olá, colegas do Java.

Estou tendo que criar um cliente para o webservice disponibilizado pelo www.portaltui.net, porém, para consumir preciso passar junto com o xml SOAP, meu usuario, senha e token.

Estou desenvolvendo utilizando o netbeans, que já utilizei com sucesso para o desenvolviemtno de outros clientes que não exigiam estes dados de validação.

Alguém daqui do forum já teve que utilizar o netbeans para desenvolver um cliente que exige autenticação.

Tem como me passar um exemplo.

Obrigado.

O URL do WebService é http://www.portaltui.net/webservices/PortalTUI.asmx.

Estou tentando realizar a seguinte tentativa com o seguinte código:

            try {
                //Criar HTTP Connection
                URL url = new URL("http://www.portaltui.net/webservices/PortalTUI.asmx/WSDL");
                HttpURLConnection urlconn;
                urlconn = (HttpURLConnection) url.openConnection();
                //Preparar cabeçalho do HTTP Request
                urlconn.setRequestMethod("POST");
                urlconn.setRequestProperty("Content-Type", "text/xml; charset=urf-8");
                urlconn.addRequestProperty("SOAPAction", "http://tempuri.org/EnviarDados\"");
                urlconn.setDoOutput(true);
                //Criar conteúdo HTTP Request
                OutputStream out = urlconn.getOutputStream();
                //Montar SOAP (XML)
                StringBuilder soapIn = soap();

                for (int i = 0; i < soapIn.length(); i++) {
                    out.write(soapIn.charAt(i));
                }

                Document doc;

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();

                InputStream connInputStream = urlconn.getInputStream();

                doc = db.parse(connInputStream);

                String retorno = doc.getDocumentElement().getFirstChild().getFirstChild().getFirstChild().getFirstChild().getNodeValue();

                System.out.println("Resultado: " + retorno);
            } catch (MalformedURLException ex) {
                Logger.getLogger(ProcessoMB.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(ProcessoMB.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ParserConfigurationException | SAXException ex) {
                Logger.getLogger(ProcessoMB.class.getName()).log(Level.SEVERE, null, ex);
            }

porém está ocorrendo o seguinte erro:

Listening for transport dt_socket at address: 9009
SEVERE: java.io.IOException: Server returned HTTP response code: 500 for URL: http://www.portaltui.net/webservices/PortalTUI.asmx/WSDL
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
	at br.feb.controller.ProcessoMB.run(ProcessoMB.java:70)
	at java.lang.Thread.run(Thread.java:722)

quando chega na linha: InputStream connInputStream = urlconn.getInputStream();

Erro 500 é erro de servidor. Pelo que imagino, ele não gostou de algum parâmetro e retornou um erro para você.

<?xml version="1.0" encoding="utf-8"?>
<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>
<AuthenticationSoapHeader xmlns="http://tempuri.org/">
<Pw>minhasenha</Pw>
<User>meuusuario</User>
<DevToken>token</DevToken>
</AuthenticationSoapHeader>
</soap:Header>
<soap:Body>
<EnviarDados xmlns="http://tempuri.org/">
<sXML>
<?xml version="1.0" encoding="utf-8" ?>
<dados xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<cod_filial>001</cod_filial>
<matricula>500000</matricula>
<tipo_vinculo>1</tipo_vinculo>
<nome>NOME DA PESSOA</nome>
<nome_resumido>NOME RESUMIDO</nome_resumido>
<cpf_numero>12345678901</cpf_numero>
<cod_barras>500000</cod_barras>
<ano_em_curso>01</ano_em_curso>
<data_termino_curso>2020/1</data_termino_curso>
<curso>BACHARELADO EM CURSO</curso>
<linha_4>BACHARELADO EM CURSO</linha_4>
</dados>
</sXML>
</EnviarDados>
</soap:Body>
</soap:Envelope>

Estou enviando o xml desta forma e o erro permanece.

O código para envio, que estou utilizando é o seguinte.

                //Criar HTTP Connection
                URL url = new URL("http://www.portaltui.net/webservices/PortalTUI.asmx/");
                HttpURLConnection urlconn;
                urlconn = (HttpURLConnection) url.openConnection();
                //Preparar cabeçalho do HTTP Request
                urlconn.setRequestMethod("POST");
                urlconn.setRequestProperty("Content-Type", "text/xml; charset=urf-8");
                urlconn.addRequestProperty("SOAPAction", "http://tempuri.org/EnviarDados\"");
                urlconn.setDoOutput(true);
                //Criar conteúdo HTTP Request
                OutputStream out = urlconn.getOutputStream();
                //Montar SOAP (XML)
                StringBuilder soapIn = soap();
                
                String texto = soapIn.toString(); //Na variável Texto contém o xml informado assima.

                for (int i = 0; i < soapIn.length(); i++) {
                    out.write(soapIn.charAt(i));
                }

                Document doc;

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();

                InputStream connInputStream = urlconn.getInputStream();

                doc = db.parse(connInputStream);

                String retorno = doc.getDocumentElement().getFirstChild().getFirstChild().getFirstChild().getFirstChild().getNodeValue();

                System.out.println("Resultado: " + retorno);

Peço, por favor que me ajudem a resolver este problema.

Eu não precisei fazer esta parte da chamada e do envio na mão, para isso eu usei o ws-import que o propio netbeans tem.
somente no momento em que faço as chamadas que eu edito o conteudo do SOAP antes do envio.

primeiro crio o handler que vai fazer essa edição:

[code]public class LoggingHandler implements SOAPHandler{

/** Creates a new instance of LoggingHandler */
public LoggingHandler() {
}

public java.io.FileOutputStream fos;

public boolean handleMessage (SOAPMessageContext c){
SOAPMessage msg = c.getMessage();
boolean request = ((Boolean) c.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();

try {

    if (request) { // This is a request message.
        // Write the message to the output stream
        SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope();
        envelope.setPrefix("soap");
        SOAPHeader header = envelope.addHeader();
        header.setPrefix("soap");
        SOAPElement el = header.addHeaderElement(envelope.createName("AuthenticationSoapHeader ","", "http://tempuri.org/"));
        SOAPElement el2 = el.addChildElement("Pw");
        el2.setValue(MINHA_SENHA);
        el2 = el.addChildElement("User");
        el2.setValue(MEU_USER);
        el2 = el.addChildElement("DevToken");
        el2.setValue(MEU_TOKEN);
        SOAPBody body = envelope.getBody();
        body.setPrefix("soap");
        msg.saveChanges();       
    }
}

catch (Exception e) {
if (request)
System.out.println(“erro request:”);
else
System.out.println(“erro response:”);
System.out.println(e);
}
return true;
}

public boolean handleFault (SOAPMessageContext c) {
SOAPMessage msg = c.getMessage();
try {
this.fos = new java.io.FileOutputStream(“C:/log-erro.txt”);
msg.writeTo (fos);
}
catch (Exception e) {System.out.println(e);}
return true;
}

public void close (MessageContext c) {

}

public java.util.Set getHeaders() {
// Not required for logging
return null;
}

}[/code]

e no momento em que for ser acionado o serviço, é preciso editar para que passe pelo handler:

WebServicePortalTUI service = new WebServicePortalTUI(); WebServicePortalTUISoap port = service.getWebServicePortalTUISoap(); BindingProvider bp = (BindingProvider) port; Binding binding = bp.getBinding(); this.setMetodo("logging handler"); java.util.List handlerList = binding.getHandlerChain(); if (handlerList == null) handlerList = new java.util.ArrayList(); LoggingHandler loggingHandler = new LoggingHandler(); //aqui que é feita a edição handlerList.add(loggingHandler); binding.setHandlerChain(handlerList);

Obrigado!

Vou fazer do jeito que você disse e depois posto o resultado.

Mas de qualquer forma, muito obrigado mesmo.

Obrigado afffernando, consegui resolver por meio da sua ajuda.