Sistema Eletrônico do Serviço de Informações ao Cidadão – e-Sic Tutorial Consumindo Webservices Java Versão 1.1 Histórico de Revisão Autor Data Descrição Versão Marcio Otta 15-10-12 Criação do documento 1.0 Marcio Otta 22-10-12 Tutorial do cliente de anexos 1.1 1. Introdução Este breve tutorial irá mostrar passo a passo a criação de um programa em Java para o consumo dos webservices do e-Sic. Neste exemplo, iremos chamar o serviço de consulta de pedidos com apenas alguns parâmetros básicos e também iremos fazer um cliente para obter os anexos de um pedido. No entanto, a mesma lógica poderá ser utilizada para os webservices de consultas de recursos. Utilizamos para este tutorial o Eclipse – versão Juno. 2. Criando um projeto no Eclipse para a consulta de pedidos Criando um projeto de consumo de webservices Abrir o eclipse e criar um projeto Java: File New Java Project. Na tela que se abre, preencha o nome do projeto e clique em Finish. Para criar as classes do Web Service: File New Other... Na janela que abre, selecionar a opção Web Services Web Service Client e clique em Next Na tela que se abre, preencha o endereço do WSDL : http://www.acessoainformacao.gov.br/sistema/Servicos/ServicoConsultaPedido.asmx?WSDL 3. Clique em Finish. Diversas classes serão criadas no seu projeto, como na figura abaixo: Crie uma nova classe no seu projeto: New Class. Preencha um nome como abaixo: Copie o código abaixo na sua classe, alterando o usuário e senha. import java.util.Calendar; import java.util.GregorianCalendar; import import import import import br.gov.acessoainformacao.RequestObterPedido; br.gov.acessoainformacao.ResponseObterPedido; br.gov.acessoainformacao.ResponsePedido; br.gov.acessoainformacao.ServicoConsultaPedidoLocator; br.gov.acessoainformacao.ServicoConsultaPedidoSoapStub; public class ConsultaPedido { public static void main(String[] args) { try { RequestObterPedido request = new RequestObterPedido(); Calendar dataInicio = new GregorianCalendar(2012,Calendar.SEPTEMBER,01); Calendar dataFim = Calendar.getInstance(); request.setDtAberturaInicio(dataInicio); request.setDtAberturaFim(dataFim); request.setUsuario("wscgu"); request.setSenha("*****"); ServicoConsultaPedidoLocator locator = new ServicoConsultaPedidoLocator(); ServicoConsultaPedidoSoapStub cliente=(ServicoConsultaPedidoSoapStub)locator.getServicoConsultaPedidoSoap(); ResponseObterPedido response; response = cliente.obterPedidos(request); System.out.println("Codigo execucao: " + response.getCodigoExecucao()); ResponsePedido[] pedidos = response.getPedidos(); System.out.println("Qtd Pedidos: " + pedidos.length); for (ResponsePedido pedido : pedidos ) { System.out.println("--------------------------------------"); System.out.println("Protocolo:" + pedido.getProtocolo()); System.out.println("Nome:" + pedido.getSolicitante().getNome()); System.out.println("Descricao:" + pedido.getDescricaoPedido()); } } catch(Exception exc) { System.out.println(exc.getMessage()); } } } Execute o projeto: Botão Direito do Mouse na Classe Run as Java Application. Ao executar o projeto, os dados dos pedidos irão ser mostrados na Console, como abaixo: 3. Criando uma classe para a consulta de anexos de pedidos Os webservices de anexos servem para a obtenção dos arquivos que foram anexados aos pedidos e aos recursos. Estes anexos, para trafegarem via webservices, são codificados em BASE-64. Para reduzir o tamanho das mensagens, o arquivo é compactado, antes da codificação para BASE-64, usando o GZIP. Portanto, o fluxo para o cliente Webservice de Anexox seria algo como: Chama o Webservice Decodifica o arquivo de BASE-64 Descompacta e salva o arquivo Abaixo o passo-a-passo para a criação deste método: No mesmo projeto do exemplo anterior, temos que adicionar a biblioteca para a decodificação de BASE-64. Usamos a biblioteca “Common Codecs” do Apache (http://commons.apache.org/codec/userguide.html) Faça o download dos JAR do conversor de base-64 do apache commons (http://commons.apache.org/codec/download_codec.cgi) Adicione os JAR no seu projeto (crie uma pasta LIB, copie o JAR nesta pasta e adicione ao “build path” Crie uma classe chamada ConsultaAnexoPedido e copie o código abaixo. Altere o número do protocolo para um que seja do seu órgão e tenha anexos. import import import import import org.apache.commons.codec.binary.Base64; br.gov.acessoainformacao.ResponseArquivo; br.gov.acessoainformacao.ResponseObterPedidoAnexo; br.gov.acessoainformacao.ServicoConsultaPedidoLocator; br.gov.acessoainformacao.ServicoConsultaPedidoSoapStub; public class ConsultaAnexoPedido { public static void main(String[] args) { try { ServicoConsultaPedidoLocator locator = new ServicoConsultaPedidoLocator(); ServicoConsultaPedidoSoapStub cliente=(ServicoConsultaPedidoSoapStub)locator.getServicoConsultaPedidoSoap(); ResponseObterPedidoAnexo responseAnexo; String protocolo = "00075000872201246"; responseAnexo = cliente.obterAnexosPedidos("wscgu", "*****", protocolo); System.out.println("Codigo execucao: " + responseAnexo.getCodigoExecucao()); ResponseArquivo[] arquivos = responseAnexo.getArquivos(); System.out.println("Qtd Anexos: " + arquivos.length); for (ResponseArquivo arquivo : arquivos) { System.out.println("---------------------------------------"); System.out.println("Nome:" + arquivo.getNomeArquivo()); byte[] decoded = Base64.decodeBase64(arquivo.getArquivoZipAndBase64().getBytes()); AnexoUtils.dezipaSalvaArquivo(decoded, "c:\\temp\\" + arquivo.getNomeArquivo()); } } catch(Exception exc) { System.out.println(exc.getMessage()); } } } • Crie uma classe chamada AnexoUtils e copie o código abaixo: import import import import import import java.util.zip.GZIPInputStream; java.io.ByteArrayInputStream; java.io.OutputStream; java.io.FileOutputStream; java.io.FileInputStream; java.io.IOException; public class AnexoUtils { public static void dezipaSalvaArquivo(byte[] bytesZip, String nomeArquivo) throws IOException { try { GZIPInputStream gzipInputStream = null; ByteArrayInputStream bais = new ByteArrayInputStream(bytesZip); gzipInputStream = new GZIPInputStream(bais); String outFilename = nomeArquivo; OutputStream out = new FileOutputStream(outFilename); byte[] buf = new byte[1024]; int len; while ((len = gzipInputStream.read(buf)) > 0) { out.write(buf, 0, len); } gzipInputStream.close(); out.close(); } catch(IOException e){ System.out.println("Ocorreu uma excecao em dezipaSalvaArquivo: " + e); } } } Ao executar, o sistema irá gravar na pasta c:\temp do seu computador os arquivos anexos do pedido.