Web Service Conexão HTTPS

10 respostas
R

Estou tentando executar uma validação utilizando a conexão com um webservice, ja fiz este com a porta 80 e o mesmo funciona corretamente, mas agora me deparei com um webservice HTTPs e o mesmo nunca funciona, pois quando o java aguarda a resposta do servidor, o mesmo não responde e cai por timeout. a seguir o codigo para que possam entender a classe:

public ComandoWebService enviaWebService2(ComandoWebService cmd, String var){
        String resp = "";
        try {
        	String[] variaveis = cmd.getVariaveis();
        	String[] valores = cmd.getValores().split(";;");
            String xmldata = "" +
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
              "<soap:Envelope "+ cmd.getEnvelope_protocolos() +">"+
              "<soap:Body>"+
              "<" + cmd.getMetodo_envio() + " xmlns=\"" + cmd.getWorkspace() + "\">";
              for(int i =0; i< variaveis.length;i++)
            	  xmldata += "<" + variaveis[i] + " "+ cmd.getMetodo_envio_protocolo()+ ">[" + valores[i] + "]</" + variaveis[i] + ">" ;
              xmldata +=""+
              "</" + cmd.getMetodo_envio() + ">"+
              "</soap:Body>"+
              "</soap:Envelope>";
              Ura ura = new Ura();
              //for(int i=0;i<valores.length;i++){
            	  xmldata = ura.colocaVariaveis(var,xmldata);
              //}
              //Create socket
              int port = Integer.parseInt(cmd.getPorta());
              InetAddress  addr = InetAddress.getByName(cmd.getHost());
              Socket sock = new Socket(addr, port);
              sock.setSoTimeout(10000);
              //Send header
              //path = "/WebService/URANovoFax.asmx";
              BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
              // You can use "UTF8" for compatibility with the Microsoft virtual machine.
              //Seta metodo Post
              String post ="POST " + cmd.getPost_comando() + " HTTP/1.1\r\n";
              wr.write(post);
              //Seta Host
              String host = "Host: " + cmd.getHost() + "\r\n";
              wr.write(host);
              //Seta Length
              String length = "Content-Length: " + xmldata.length() + "\r\n";
              wr.write(length);
              //Seta tipo
              String type = "Content-Type: text/xml; charset=\"utf-8\"\r\n";
              wr.write(type);
              //Seta Ação SOAP
              /* Cancelado SOAPAction
              String soapAction = "SOAPAction: \"" + cmd.getSoap_action() +"\"";
              System.out.println(soapAction);
              wr.write(soapAction);
              /* */
              wr.write("\r\n");
              //Envia Xml
              wr.write(xmldata);
              //Envia Comandos
              wr.flush();
              System.out.println("Enviei XML:");
              System.out.println(xmldata.replace(">", ">\n"));
              //Response
              BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
              String line;

              cmd.setXml_envio(xmldata);
              cmd.setXml_recebimento(resp);
              while((rd.ready())){
            	  line = rd.readLine();
            	  resp+=line;
              }
              cmd.setValores(getResultado(resp,cmd.getRetornos(), xmldata));
              resp = resp.replace(">",">\n");
              resp = trataResp(resp);
              SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
              //abre a conexao com o arquivo, buffer de 1 mega
              String nomeArquivo = new String();
              nomeArquivo = "C:\\" + THutil.geraRadicalSimples() + ".txt";
              File arq = new File(nomeArquivo);
              while(arq.exists()){
            	  nomeArquivo = "C:\\" + THutil.geraRadicalSimples() + ".txt";
            	  arq = new File(nomeArquivo);
              }
              THutil.escreveArquivo(nomeArquivo, resp);
              InputSource input = new InputSource(nomeArquivo);
              XMLHandler handler = new XMLHandler(cmd.getRetornos()[0], cmd);
              parser.parse(input, handler);
              cmd = handler.getComandoWebService();
              cmd.setValores(handler.getResposta());
              cmd.setXml_recebimento(resp);
              //System.out.println(resp);
              rd.close();
              System.out.println("Recebi de Retorno:" + cmd.getValores());
              THutil.apagaArquivo(nomeArquivo);
            } catch (Exception e) {
            	e.printStackTrace();
            }
        return cmd;
    }

Quando faço a verificação se o BufferReader esta pronto o mesmo retorna false;
:?

10 Respostas

N

Opa.

Rastaman, você ja pensou em usar algum frame que faço todo o serviço ‘sujo’ do soap que tu ta fazendo na mão?
Não entendi que validação esta tentando fazer.
Usando socket para enviar o soap??

:slight_smile:

Abraço.

R

nebal.metz:
Opa.

Rastaman, você ja pensou em usar algum frame que faço todo o serviço ‘sujo’ do soap que tu ta fazendo na mão?
Não entendi que validação esta tentando fazer.
Usando socket para enviar o soap??

:slight_smile:

Abraço.


Então, man, ja pensei, mas ainda não achei um frame compativel (ou não soube usar), este codigo funciona corretamente pra enviar, estou enviando um xml para o servidor HTTPS de meu cliente, a requisição é enviada com sucesso, mas não consigo obter a resposta do WS do cliente, (este codigo funciona com HTTP normalmente).

T

Bom, você não postou seu código que faz a conexão com o web service https. Ele tem de usar um SSLSocket em vez de um Socket normal, a menos que você seja expert em implementar o protocolo SSL a partir do zero (o que também não está escrito no seu código).
De qualquer maneira, também não é muito trivial usar um SSLSocket.
http://java.sun.com/javase/6/docs/api/javax/net/ssl/SSLSocket.html

N

Certo,

Da uma olhada no frame http://ws.apache.org/axis/, aqui mesmo no guj tem um tem tutorial bacana.
Creio que passo te ajudar e seja mais facil que do que essa mão toda que tu ta fazendo.

:slight_smile:

Abraço

R

Efetuei algumas alterações conforme vcs me indicaram, agora com este Código.

public String enviaWebServiceHTTPS(String[]  campos){
	        String resp="";
	        try {

	            String xmldata = campos[0];
	              //Create socket
	              int port = Integer.parseInt(campos[1]);
	              InetAddress  addr = InetAddress.getByName(campos[2]);
	              //Connect to the server using an SSL socket
	              SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
	              SSLSocket socket = (SSLSocket) factory.createSocket(campos[2],Integer.parseInt(campos[1]));
	              Writer wr = new OutputStreamWriter(socket.getOutputStream(),"US-ASCII");
	              String post ="POST " + campos[3] + " HTTP/1.1\r\n";
	              System.out.print(post);
	              wr.write(post);
	              //Seta Host
	              String host = "Host: " + campos[2] + "\r\n";
	              System.out.print(host);
	              wr.write(host);
	              //Seta Length
	              String length = "Content-Length: " + xmldata.length() + "\r\n";
	              System.out.print(length);
	              wr.write(length);
	              //Seta tipo
	              String type = "Content-Type: text/xml; charset=\"utf-8\"\r\n";
	              System.out.print(type);
	              wr.write(type);
	              //Seta Ação SOAP
	              /* Cancelado SOAPAction
	              String soapAction = "SOAPAction: \"" + campos[4] +"\"";
	              System.out.println(soapAction);
	              wr.write(soapAction);
	              /* */
	              wr.write("\r\n");
	              //Envia Xml
	              wr.write(xmldata);
	              //Envia Comandos
	              wr.flush();

	              //Response
	              BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	              String line;

	              System.out.println("\nXML Envio:\n");
	              System.out.println(xmldata.replace("><",">\n<"));
	              System.out.println("\nXML Resposta:\n");
	              while((line = rd.readLine()) != null){
	                  resp+=line;
	                  System.out.println(line);
	              }
	              resp = resp.replace(">",">\n");

	              //System.out.println(resp);
	              rd.close();
	              System.out.println(resp);
	            } catch (Exception e) {
	            	e.printStackTrace();
	            }
	        return resp;
	    }

Estou Recebendo esta resposta da requisição:

Após não é recebido mais nada.

O Endereço do webservice é este:

https://storedigital.store.com.br/gpnetws/WSGPNET.asmx?op=wsValidarEnvioFax

N

Opa.

Rastaman, da uma olhada nesse link.
http://www.eclipse.org/webtools/jst/components/ws/scenarios/axis_cjava/axcj04.html.
Nesse link usando o eclipse via wizard voce cria as classes stub e proxy de um client de webservice,
mas vai ter usar o wsdl ( https://storedigital.store.com.br/gpnetws/WSGPNET.asmx?wsdl ).
http://www.onjava.com/pub/a/onjava/2002/06/05/axis.html,
http://www.guj.com.br/posts/list/93575.java
alguns links de como fazer a chamada usando o axis.

Acho que isso resolve teu problema.
:slight_smile:

Abraço

R

nebal.metz

Opa irmão, dessa forma eu ja consegui, mas vo explicar o meu caso…

Eu trabalho com Telefonia, no caso uma URA, ou seja, vc disca, uma gravação atende e pede pra ditgitar uns dados, esses dados são preenchidos no webservice e enviado para o servidor do cliente para verificar se o sujeito é ou nuam um beneficiario cadastrado, só que como temos diversos clientes, não é possivel criarmos 1 classe WS por cliente, por isso utilizo a chamada via SOAP mesmo.

Pq as uras são cadastradas no banco de dados, sendo assim não posso fazer muitas modificações no codigo java, posso apenas receber informações do banco, e enviar uma requisição, a resposta tem q ser gravada no banco…

Ja consigo fazer isso com a 1º classe do exemplo lah em cima. Só que agora preciso conseguir fazer isso num servidor https e to lascado :?

J

Eu acho q o caminho mais simples ainda eh utilizar JAX-WS…

Leia abaixo a partir de Write the Client:
http://www.java-tips.org/java-ee-tips/java-api-for-xml-web-services/using-jax-ws-based-web-services-wit.html

As partes chatas do processo consistem na importacao do certificado e geracao do client via wsimport… O resto eh simples.

R

Puts, infelizmente, não pode ser feito desta forma, pois eu necessito que os parametros do webservice sejam passados dinamicamente, ou seja, não posso recompilar o codigo a cada novo cliente adicionado, pois trabalho com telefonia e a cada recompilação nosso servidor fica fora do ar e o nosso E1 fica indisponível durante este processo.

Precisava que de alguma forma fosse possível eu receber o WSDL pegar os dados digitados no Sistema de URA (Unidade de Reconhecimento Audivel - Através do Telefone) preencher as informações necessárias e enviar a requisição para validar ou não a navegação no resto da URA.

Isso sem ter que criar novas classes, pois a cada nova validação via webservice (isso ocorre muitas vezes) teria de ser criado nova classe…

Caso seja possível por favor me ajudem, pois eu consegui fazer isso utilizando o código do primeiro post deste fórum, só estou tendo dificuldades com o envio para https…

:roll:

J

Bom, se seu problema consiste em apenas ignorar https, sugiro q utilize commons httpclient com EasySSLProtocolSocketFactory:

http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/trunk/src/contrib/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java?view=markup

Criado 17 de novembro de 2008
Ultima resposta 19 de nov. de 2008
Respostas 10
Participantes 4