Consumir WebService do PortalTUI

6 respostas
J

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

J

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ê.

J
<?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.

A

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

Obrigado!

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

Mas de qualquer forma, muito obrigado mesmo.

J

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