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 br.gov.acessoainformacao.requestobterpedido; import br.gov.acessoainformacao.responseobterpedido; import br.gov.acessoainformacao.responsepedido; import br.gov.acessoainformacao.servicoconsultapedidolocator; import 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 org.apache.commons.codec.binary.base64; import br.gov.acessoainformacao.responsearquivo; import br.gov.acessoainformacao.responseobterpedidoanexo; import br.gov.acessoainformacao.servicoconsultapedidolocator; import 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 java.util.zip.gzipinputstream; import java.io.bytearrayinputstream; import java.io.outputstream; import java.io.fileoutputstream; import java.io.fileinputstream; import 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.