Consumir WebService do PortalTUI

6 respostas
jrfercar

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.

6 Respostas

jrfercar

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();

E

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

jrfercar
<?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>[telefone removido]</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.

afffernando

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:

public class LoggingHandler  implements SOAPHandler<SOAPMessageContext>{
    
    /** 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;
}
    
}

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);
jrfercar

Obrigado!

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

Mas de qualquer forma, muito obrigado mesmo.

jrfercar

Obrigado afffernando, consegui resolver por meio da sua ajuda.

Criado 26 de abril de 2013
Ultima resposta 23 de mai. de 2013
Respostas 6
Participantes 3