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.