Você está na página 1de 18

Configurando Cliente de Web Service HTTPS com Eclipse

Sistema RDR Web Services Verso 1.0.0 (reviso: 132)

Banco Central do Brasil, 2010

Sumrio
1 nstru!"es iniciais################################################################################################################$ 2 mplementando cliente com %&'(WS )%*+ 1#,-#################################################################. 2#1 Criando um pro/eto %ava no Eclipse############################################################################. 2#2 Criando ar0uivo de autentica!1o do Web Service######################################################. 2#$ niciando a gera!1o das classes#################################################################################. 2#. 2eali3ando a c4amada ao Web Service#####################################################################5 2#5 %&'(WS com 6aven####################################################################################################, $ mplementando cliente WS com &' S e Eclipse S*+########################################################7 $#1 Criando um pro/eto B8sico no Eclipse#########################################################################7 $#2 9erificando a %2E utili3ada pelo Eclipse#####################################################################7 $#$ &dicionando Web Services Client no Eclipse S*+#####################################################7 $#. 2eali3ando a primeira c4amada ao Web Service#######################################################: $#5 Criando classe com o m;todo main############################################################################< . mportando os certificados de acesso##############################################################################10 .#1 Bai=ando os certificados############################################################################################10 .#2 mportando os certificados para a %96 padr1o#########################################################11 5 2espondendo demandas com ane=os#############################################################################1$ 5#1 >pera!1o responder##################################################################################################1$ 5#2 >pera!1o responderBase,.#####################################################################################1. , 2ecuperando ane=os do WS############################################################################################1, 7 Problemas con4ecidos######################################################################################################17 7#1 9alidade do '6?########################################################################################################17 7#2 nvalid element org#apac4e#a=is#encoding#ser#Bean*eseriali3er#onStartC4ild#########17 7#$ T4ere@s no >b/ectAactorB Cit4 an D'mlElement*ecl for t4e element#####################17

Banco Central do Brasil, 2010

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina $ de 1:

1 Instrues iniciais
Para esta configura!1o foi utili3ado o Eclipse S*+ Helios S21 com o %2E vers1o , atuali3a!1o 22 )1#,#0E22(b0.- com sistema WindoCs 'P Professional# Siga a ordem dos tFpicos a seguir para concluir a configura!1o do Cliente# Se vocG tem certe3a de 0ue nunca importou os certificados do B&CEH, necess8rios para acesso ao WS, pode ir direto para o passo Importando os certificados de acesso na p8gina 10, antes de iniciar 0ual0uer configura!1o do cliente# Heste manual, s1o descritos duas maneiras de gerar um cliente de Web Services em %avaI - Implementando cliente WS com AXIS e Eclipse SDK; e - Implementando cliente com JAX-WS JDK 1!"#! Escol4a a configura!1o 0ue mel4or se aplica a sua organi3a!1o, e siga as orienta!"es# Todos os recursos do Web Service )inclusive o WS*?- s1o protegidos por usu8rio e sen4a de acesso# &s credenciais de acesso s1o as mesmas utili3adas no sistema 2*2JS SC&P e devem ser fornecidas no formato $institui%o&$depend'ncia&!$usurio& )e=emploI ()*+,,-,)!cef(1*..-# > usu8rio do Web Service, deve estar credenciado nas transa!"es SSCP001 eJou SSCP002 do S SB&CEH no ambiente de 4omologa!1o# Ksu8rios 0ue /8 possuem acesso ao 2*2JS SC&P, automaticamente /8 possuem acesso tamb;m aos servi!os do Web Service 2*2 e vice(versa#

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina . de 1:

* Implementando cliente com JAX-WS JDK 1!"#


%&'(WS ; a especifica!1o de Web Service padr1o /8 inclusa no %*+ 1#, ou superior# L possMvel utili3ar esta especifica!1o com vers"es anteriores do %ava, bastando incluir as bibliotecas corretas no classpat4, por;m este procedimento n1o ser8 abordado# mportante ressaltar 0ue antes de iniciar este tFpico, ; necess8rio fa3er a importa!1o dos certificados )p8gina 10 ( mportando os certificados de acesso- para a %2E utili3ada pelo %*+ 1#, instalado na m80uina# Para este e=emplo, foi utili3ada a %*+ vers1o 1#,#0 atuali3a!1o 22 )1#,#0E22-#

2.1 Criando um projeto Java no Eclipse


&ntes de iniciar a gera!1o do cliente, crie um pro/eto simples no Eclipse, utili3ando %2E ou %*+ 1#,# Caso ten4a alguma dNvida 0uanto ao procedimento v8 at; ao tFpico OCriando um pro/eto B8sico no EclipseO na p8gina 7#

2.2 Criando arquivo de autenticao do Web Service


Ha rai3 do pro/eto 0ue foi criado no passo anterior, crie um ar0uivo com o nome de Oaut4file#t=tP com o conteNdo a seguir# Este ar0uivo ser8 utili3ado pela ferramenta wsimport do %*+ para acessar o WS*? e reali3ar a gera!1o das classes# https://usuario:senha@www9.bcb.gov.br/hml/rdrws/services/InstituicaoService?wsdl substitua o te=to em negrito pelo usu8rio e a sen4a do S SB&CEH utili3ada para acesso ao Web Service# >bserve 0ue a parte final refere(se ao WS*? a partir do 0ual ser8 gerado as classes de acesso ao servi!o#

2.3 Iniciando a erao das classes


&bra o Prompt de Comando ) niciar Q E=ecutar, cmd, Enter-R Havegue at; a pasta rai3 do pro/eto 0ue foi criado no passo 2#1 )E=emploI cd *ISCorTspaceSclientCs/a=-R & ferramenta 0ue fa3 a gera!1o do cliente n1o fa3 parte da %2E e sim do %*+, por isso, normalmente em uma instala!1o padr1o, o %*+ n1o est8 incluso no P&TH do WindoCs# Heste caso, recomenda(se referenciar diretamente a ferramente 0ue encontra( se em U%&9&EH>6EUSbinSCsimport, ou ent1o criar a vari8vel de ambiente %&9&EH>6E apontando para um %*+ 1#, v8lido# & partir da0ui, a pasta rai3 do %*+ ser8 referenciada como U%&9&EH>6EU, para facilitar o entendimento# Supondo 0ue no passo 2#1 foi criado um pro/eto com as configura!"es padr"es, ent1o a pasta de fontes ; a OsrcP e as classes s1o compiladas para a pasta ObinP# *igite no prompt o seguinte comandoI D:\workspace\clientwsja !"#$%&%'()*+#\bin\wsimport",-e tension,-s,src,-d,bin, -.auth/ile,"auth/ile.t t",https://www9.bcb.gov.br/hml/rdrws/services/InstituicaoService? wsdl o parVmetro -extension ignora os avisos durante a interpreta!1o do WS*?R -s informa o diretFrio onde ser8 colocado os ar0uivos #/ava geradosR - informa o diretFrio onde sera colocado os ar0uivos compiladosR ('aut4file informa o ar0uivo 0ue foi criado no passo 2#2 para autentica!1o#

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 5 de 1:

*!. /eali0ando a c1amada ao We2 Ser3ice


&tuali3e o pro/eto do Eclipse para onde foram geradas as classes de acesso ao Web Service, clicando sobre o mesmo e logo em seguida em O2efres4P# Crie a classe de e=emplo abai=o, dentro deste pro/eto )preferencialmente fora dos pacotes gerados pelo %*+-#
import import import import java.net.Authenticator; java.net.PasswordAuthentication; java.util.GregorianCalendar; java.util.List;

import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype. !LGregorianCalendar; import import import import import import import "r.gov."c".rdr.siscapws.o"jetos.xsd.Demanda#$%; "r.gov."c".rdr.siscapws.o"jetos.xsd.&ituacao#$%; "r.gov."c".rdr.siscapws.o"jetos.xsd.%ipoPes'uisa#$%; "r.gov."c".rdr.siscapws.services.Get&ituacoes(esponse; "r.gov."c".rdr.siscapws.services.Get%iposPes'uisa(esponse; "r.gov."c".rdr.siscapws.services.)nstituicao&ervice; "r.gov."c".rdr.siscapws.services.)nstituicao&ervicePort%ype;

public class !ain * public static void main+&tring,- args. throws /xception * 00Colo'ue a senha de acesso ao sis"acen a'ui Authenticator.setDefault+new Authenticator+. * protected PasswordAuthentication getPasswordAuthentication+. * &tring user 1 2usuario2; &tring password 1 2senha2; return new PasswordAuthentication+user3 password.toCharArray+..; 4 4.; )nstituicao&ervice service 1 new )nstituicao&ervice+.; )nstituicao&ervicePort%ype endpoint 1 service.get)nstituicao&ervice5ttp&oap66/ndpoint+.; Get&ituacoes(esponse situacoes 1 endpoint.get&ituacoes+.; List7&ituacao#$%8 lista 1 situacoes.get(eturn+.; for +&ituacao#$% situacao#$% 9 lista. * &ystem.out.println+situacao#$%.getDescricao+..get:alue+..; 4 Get%iposPes'uisa(esponse tiposPes'uisa(esponse 1 endpoint.get%iposPes'uisa+.; List7%ipoPes'uisa#$%8 tiposPes'uisa 1 tiposPes'uisa(esponse.get(eturn+.; for +%ipoPes'uisa#$% tipoPes'uisa#$% 9 tiposPes'uisa. * &ystem.out.println+tipoPes'uisa#$%.getCodigo+..get:alue+. ; 2 2 ; tipoPes'uisa#$%.getDescricao+..get:alue+..; 4 DatatypeFactory <actory 1 DatatypeFactory.newInstance+.; !LGregorianCalendar data)nicio 1 <actory.new !LGregorianCalendar+new GregorianCalendar+=>>?3 @3>@3 >3 >3 >..; !LGregorianCalendar dataFim 1 <actory.new !LGregorianCalendar+new GregorianCalendar+=>663 @3>@3 >3 >3 >..;

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina , de 1:

List7Demanda#$%8 demandas 1 endpoint.getDemandas+data)nicio3 dataFim3 2A23 null3 null.; for +Demanda#$% demanda#$% 9 demandas. * &ystem.out.println+demanda#$%.get)d)nterno+..get:alue+. ;2 2;demanda#$%.getAumeroDemanda+..get:alue+..; 4 4 4

*!) JAX-WS com 4a3en


L possMvel utili3ar o 6aven, para reali3ar a gera!1o do cliente de Ceb service, descrito nos passos anteriores# Para isso basta incluir o plugin abai=o com as configura!"es, no pom#=mlI
7plugin8 7group)d8org.codehaus.mojo70group)d8 7arti<act)d8jaxwsBmavenBplugin70arti<act)d8 7version86.6=70version8 7executions8 7execution8 7goals8 7goal8wsimport70goal8 70goals8 7con<iguration8 7wsdl$rls8 7wsdl$rl8https900www?."c".gov."r0hml0rdrws0services0)nstituicao&erviceC wsdl70wsdl$rl8 70wsdl$rls8 7extension8true70extension8 7ver"ose8true70ver"ose8 7xauthFile8auth<ile.txt70xauthFile8 70con<iguration8 70execution8 70executions8 70plugin8

L possMvel tamb;m, gerar as classes do cliente utili3ando todos os WS*? dos servi!os suportados pelo Web Service, repetindo o elemento OCsdlKrlP para cada servi!o do 2*2 Web Service# 6as aten!1o, 48 um problema con4ecido ao ler v8rios WS*?s com o mesmo namespace Q ve/a mais na p8gina 17 ( OT4ere@s no >b/ectAactorB Cit4 an D'mlElement*ecl for t4e elementO#

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 7 de 1:

+ Implementando cliente WS com AXIS e Eclipse SDK


3.1 Criando um projeto !"sico no Eclipse
&ntes de mapear as classes do Ceb services ; necess8rio criar um pro/eto %ava no Eclipse# Cli0ue em 5ile 6 7e8 6 Ja3a 9ro:ectR Aorne!a um nome para o pro/eto )sugest1oI c!ienttest-R Cli0ue 7e;tR Cli0ue em 5inis1 para finali3ar a configura!1o#

3.2 #eri$icando a J%E utili&ada pelo Eclipse


Cli0ue em Windo8 6 9referencesR Procure pela aba Ja3a 6 Installed J/Es# Hesta aba aparecer8 todas as %96s instaladas no sistema# & %2E padr1o utili3ada pelo Eclipse ; a 0ue estiver marcada# L possMvel verificar tamb;m por este outro camin4oI Cli0ue em <elp 6 A2out EclipseR &gora em Installation DetailsR Cli0ue a aba =onfi>urationR procure pelo parVmetro (vm e logo abai=o observe o diretFrio da 96 0ue o Eclipse est8 utili3ando )E=emploI ":#$r%&ivos e pro'ramas#(ava#)re*#bin#c!ient#)vm. !!-# &note o camin4o onde a %2E padr1o do Eclipse est8 instalada, pois ser8 utili3ado mais tarde#

3.3 'dicionando Web Services Client no Eclipse S()


Para gerar as classes do Web ServiceI Cli0ue em 5ile 6 7e8 6 ?t1er!!!R Procure pelo Ci3ard We2 Ser3ices 6 We2 Ser3ice =lient e cli0ue duas ve3es no mesmoR Ho indicador 0ue aparece, arraste o mesmo at; o nMvel De3elop client como mostra a figura abai=oR

Ho campo Ser3ice definition colo0ue a K2? 0ue possui o WS*? )neste e=emplo useI 4ttpsIJJCCC<#bcb#gov#brJ4mlJrdrCsJservicesJ nstituicaoServiceW Csdl-R &o terminar de digitar o endere!o ou mover o foco para fora do campo, o Eclipse dever8 E=ibir uma tela com usu8rio e sen4a a serem informados ou a mensagem de erro @1e ser3ice definition selected is in3alid R caso esta mensagem ten4a sido e=ibida pelo Eclipse, v8 para o tFpico Importando os

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina : de 1:

certificados de acesso )p8gina 10- e ao finali3ar este passo adicional, fec4e o Eclipse e inicie novamente, retomando a configura!1o at; este ponto# Se o certificado tiver sido importado com sucesso, o Eclipse mostrar8 a telaI

forne!a o usu8rio e a sen4aR Cli0ue >+R Caso apare!a a telaI

Basta clicar >+ e continuar normalmenteR Ha sess1o de =onfi>urationA selecione os seguintes itensI Web service runtimeI &pac4e &=is Client pro/ectI clienttest observe 0ue o pro/eto informado deve ser o mesmo pro/eto criado no passo =riando um pro:eto Bsico no Eclipse )p8gina 7-R Cli0ue em 7e;tR Cli0ue em 5inis1 e aguarde a cria!1o e gera!1o das classes do Web Service pelo EclipseR

3.* %eali&ando a primeira c+amada ao Web Service


Xuando a gera!1o das classes estiver finali3ada, ; necess8rio adicionar o usu8rio e a sen4a no cFdigo gerado pelo Eclipse, antes de criar a classe de teste do Web Service# Procure pela classe 0ue possui a termina!1o Bindin>Stu2!:a3a normalmente ela possui o nome do servi!o importado pelo WS*?, e=emplo InstituicaoSer3iceSoap11+in in'St&b.)avaR Procure pelo m;todo createCall) Procure pelas lin4as de cFdigo, dentro deste m;todoI
if +super.cached$sername D1 null. * Ecall.set$sername+super.cached$sername.; 4 if +super.cachedPassword D1 null. * Ecall.setPassword+super.cachedPassword.; 4

e altere(as para 0ue fi0uem parecidas comI


Ecall.set$sername+2>@=FGG?G@.ce<6=FH2.; Ecall.setPassword+2sua senha a'ui2.;

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina < de 1:

3., Criando classe com o m-todo main


Crie uma nova classe no Eclipse dentro do pro/eto c!ienttest com o m;todo main com a seguinte implementa!1oI
public static void main+&tring,- args. throws /xception * Calendar dataFim 1 Calendar.getInstance+.; Calendar data)nicio 1 Calendar.getInstance+.; data)nicio.set+Calendar.YEAR3 =>>?.; &tring tipoConsulta 1 2A2; )nteger totalDemandas 1 new )nstituicao&erviceLocator+..get)nstituicao&ervice5ttp&oap66/ndpoint+..get%otalDe mandas+data)nicio3 dataFim3 tipoConsulta3 null.; &ystem.out.println+totalDemandas.; 4

E=ecute a classe utili3ando a mesma %2E 0ue cont;m os certificados necess8rios# Este cFdigo ; a consulta do total de demandas e=istentes para os parVmetros informados, este total ; impresso no console# &0ui termina a configura!1o do cliente, lembrando 0ue ; apenas uma configura!1o de teste e 0ue podem 4aver particularidades do ambiente 0ue fogem do escopo deste documento e 0ue devem ser tratadas por conta e risco de 0uem est8 implementando#

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 10 de 1:

. Importando os certificados de acesso


Para importar os certificados de acesso para a %96 padr1o do Eclipse, siga os passos adiante, lembrando 0ue este procedimento ; necess8rio somente uma ve3 por %96# Considere 0ue a %96 padr1o utili3ada pelo Eclipse est8 instalada em CIS&r0uivos de programasS%avaS/re,S#

*.1 !ai.ando os certi$icados


Com o broCser Airefo=, acesse o endere!o do Web Service ( 4ttpsIJJCCC<#bcb#gov#brJ4mlJrdrCsJ R Cli0ue no Mcone ao lado es0uerdo do endere!o do WS

Cli0ue em 4ais informaes!!!R Ha tela 0ue aparece, cli0ue em E;i2ir certificadoR Cli0ue na aba Detal1esR

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 11 de 1:

E=porte todos os certificados da Hierar0uia clicando sobre o certificado e logo apFs no bot1o E;portar!!!R Salve o certificado no diretFrio ,($V$-./01,#!ib#sec&rit2, lembrando 0ue este %&9&EH>6E deve ser a mesma %96 utili3ada pelo Eclipse )E=emploI ":#$r%&ivos e pro'ramas#(ava#)re*#!ib#sec&rit2 Se os certificados necess8rios n1o tiverem sofrido nen4uma mudan!a, os seguintes certificados foram encontrados e bai=ados para sua m80uinaI (#bcb#gov#br#crt &utoridadeCertificadoradoSE2P2>Ainalv2#crt &utoridadeCertificadora2ai3Brasileirav1#crt &utoridadeCertificadoraSE2P2>v2#crt

*.2 Importando os certi$icados para a J#/ padro


&bra o prompt de comando ) niciar J E=ecutar, cmd, Enter-# &ten!1o, ; necess8rio e=ecutar o prompt de comando com privil;gios de administrador# Havegue at; o diretFrio da %96 padr1o, digitando o comando cd =ACArDui3os de pro>ramasCJa3aC:re"C2inR

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 12 de 1:

Aa!a um bacTup copiando o ar0uivo original =ACArDui3os de pro>ramasCJa3aC:re"Cli2CsecuritECcacerts para outro lugar, pois este ser8 modificado ao importar os certificados# Supondo 0ue foram bai=ados os 0uatro certificados no passo anterior, repita o comando abai=o 0uatro ve3es, uma para cada certificado, substituindo o nome em negrito pelo nome do ar0uivo sem a e=tens1oI TeBtool (import (trustcacerts (TeBstore ##JlibJsecuritBJcacerts (storepass c4angeit (noprompt (alias nomeFdoFcertificado (file ##JlibJsecuritBJnomeFdoFcertificado#crt E=emploI CIS&r0uivos de programasS%avaS/re,SbinYGeEtool -import -trustcacerts -GeEstore !!6li26securitE6cacerts -storepass c1an>eit -noprompt -alias Autoridade=ertificadora/ai0Brasileira31 -file !!6li26securitE6Autoridade=ertificadora/ai0Brasileira31!crt CIS&r0uivos de programasS%avaS/re,SbinYGeEtool -import -trustcacerts -GeEstore !!6li26securitE6cacerts -storepass c1an>eit -noprompt -alias Autoridade=ertificadoraSE/9/?3* -file !!6li26securitE6Autoridade=ertificadoraSE/9/?3*!crt CIS&r0uivos de programasS%avaS/re,SbinYGeEtool -import -trustcacerts -GeEstore !!6li26securitE6cacerts -storepass c1an>eit -noprompt -alias Autoridade=ertificadoradoSE/9/?5inal3* -file !!6li26securitE6Autoridade=ertificadoradoSE/9/?5inal3*!crt CIS&r0uivos de programasS%avaS/re,SbinYGeEtool -import -trustcacerts -GeEstore !!6li26securitE6cacerts -storepass c1an>eit -noprompt -alias -!2c2!>o3!2r -file !!6li26securitE6-!2c2!>o3!2r!crt Xuando o comando for e=ecutado corretamente a seguinte mensagem ; e=ibidaI Certi$icate 0as added to 1e2store

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 1$ de 1:

) /espondendo demandas com ane;os


> Web Services 2*2 contempla duas formas de envio de ar0uivos em resposta a demandas# Ser8 mostrado a implementa!1o de e=emplo das duas estrat;gias 0ue possuem comple=idade de implementa!1o e performance bem diferentes# L importante ressaltar essas opera!"es est1o disponMveis no servi!o &tuali3ar*emandaService deste Web Service, o 0ue fa3 necess8rio gerar as classes no Eclipse para este servi!o, seguindo os passos descritos na p8gina 7 deste manual utili3ando o endere!o correto do servi!o de atuali3a!1o de demandas#

,.1 3perao responder


Envia o ar0uivo como parte do corpo da re0uisi!1o HTTP P>ST no formato 6 6E )6ultipurpose nternet 6ail E=tensions-# Essa estrat;gia de envio de ane=o ; a mesma 0ue ; utili3ada para enviar ar0uivos em mensagens de e(mail# Cabe ressaltar 0ue apesar de possuir uma maior comple=idade de implementa!1o, esta opera!1o possui um mel4or desempen4o em compara!1o com a >pera!1o responderBase,. pois o ane=o n1o recebe um tratamento e=tra para poder ser enviado al;m de n1o ter o taman4o original do ar0uivo aumentado# L muito importante 0ue esta opera!1o se/a utili3ada em detrimento da outra# & mensagem, no nosso caso o '6?, e os ane=os, s1o dispostos em um formato prFprio no corpo da re0uisi!1o P>ST, ou se/a, o '6? e o ar0uivo s1o enviados na mesma re0uisi!1o, por;m ficam separados por delimitadores de conteNdo# Estes delimitadores de conteNdo possuem informa!"es sobre o tipo, identificador, vers1o do conteNdo 6 6E, entre outros atributos do ane=o transportado# )2eferGnciasI 4ttpIJJCCC#ietf#orgJrfcJrfc20.5#t=t e 4ttpIJJpt#CiTipedia#orgJCiTiJ6 6E-# Em %ava, temos as &P s java..activation e java..mail 0ue implementam toda a comple=idade necess8ria para criar ane=os em mensagens com conteNdo 6 6E# &ntes de codificar o e=emplo a seguir ; necess8rio adicionar ao classpat4 da aplica!1o as bibliotecas do %ava6ail &P # Hormalmente possuem o nome activation#/ar e mail#/ar e est1o inclusas por padr1o na maioria dos servidores %EE como %B>SS, Tomcat e Websp4ere# Km dos parVmetros desta opera!1o ; o content-i 0ue ; o identificador do conteNdo referente ao ane=o 0ue est8 sendo enviado# & presen!a deste parVmetro determina se a resposta a uma demanda est8 sendo enviada com ane=o ou n1o# Considerando as classes 0ue foram geradas pelo Eclipse na p8gina 7 deste manual para o servi!o &tuali3ar*emandaService, ; possMvel encontrar a classe &tuali3ar*emandaServiceSoap11BindingStub# Procure pelo m;todo br#gov#bcb#rdr#siscapCs#services#&tuali3ar*emandaServiceSoap11BindingStub#responder) String, nteger, String, String- e adicione as lin4as a seguir antes da c4amada ao m;todo set>perationHame da instVncia da classe Call ) -ca!!.set/peration3ame-I
File <ile 1 new File+nomeAr'uivo.; nomeAr'uivo 1 <ile.getAame+.; AttachmentPart attachmentPart 1 new AttachmentPart+new Data5andler+new FileData&ource+<ile...; content)d 1 attachmentPart.getContent)d+.;; Ecall.addAttachmentPart+attachmentPart.;

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 1. de 1:

>bserve 0ue nas lin4as acima, estamos re(atribuindo as vari8veis nome&r0uivo e content d com os valores reais 0ue ser1o repassados ao WS durante a c4amada# ?ogo a seguir tem(se o e=emplo da c4amada a esta opera!1o, 0ue acionar8 o WS enviando o ar0uivo e a resposta para o encamin4amentoI
public class (esponderDemanda * public static void main+&tring,- args. throws /xception * AtualiIarDemanda&erviceLocator locator 1 new AtualiIarDemanda&erviceLocator+.; AtualiIarDemanda&ervicePort%ype endpoint 1 locator.getAtualiIarDemanda&ervice5ttp&oap66/ndpoint+.; &tring resposta 1 2(espondendo o encaminhamento =6?J>F pelo K&2; )nteger id/ncaminhamento 1 new )nteger+=6?J>F.; &tring nomeAr'uivo 1 2C9LLPrMBprojeto.pd<2; 4 4 endpoint.responder+resposta3 id/ncaminhamento3 null3 nomeAr'uivo.;

,.2 3perao responder!ase4*


Envia o ane=o da resposta codificado em Base ,.# Todo Web Service fa3 uso do '6? como formato de transporte dos dados entre o cliente e o servidor, por;m, o '6? possui algumas restri!"es 0uanto ao conteNdo 0ue pode ser colocadoR alguns caracteres 0uando adicionados em um '6? torna(o mal formado e nen4uma ferramenta ; capa3 de interpret8(lo )4ttpIJJCCC#C$#orgJT2J2000J2EC(=ml(2000100,ZHT(C4ar- # Esta opera!1o recebe o conteNdo do ar0uivo dentro do corpo do '6? enviado ao Web Service, por;m, para 0ue n1o ocorra erro no processamento do '6?, ; necess8rio converter o conteNdo do ar0uivo para Base ,. antes de enviar a resposta# Todas as linguagens de desenvolvimento possuem &P nativa para codifica!1o e decodifica!1o de conteNdo em Base ,., por isso esta t;cnica ; mais f8cil de implementar# & convers1o em base ,. resulta em um conteNdo baseado no con/unto de caracteres )[&(\a(30(<], ^J^ e ^_^- 0ue somam um total de ,. caracteres v8lidos para um '6?# & codifica!1o Base,. provoca um aumento global de $$U do volume dos dados a codificar, por isso pode representar uma sensMvel perda de performance no processamento )codifica!1oJdecodifica!1o- e no tr8fego de rede tamb;m# Este trec4o de cFdigo a seguir ; um e=emplo de implementa!1o do cliente 0ue envia a resposta para o Web Service utili3ando a opera!1o em 0uest1o#

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 15 de 1:

public class (esponderDemandaNaseJH * public static void main+&tring,- args. throws /xception * AtualiIarDemanda&erviceLocator locator 1 new AtualiIarDemanda&erviceLocator+.; AtualiIarDemanda&ervicePort%ype endpoint 1 locator.getAtualiIarDemanda&ervice5ttp&oap66/ndpoint+.; &tring resposta 1 2(espondendo o encaminhamento =6?=6J pelo K&2; )nteger id/ncaminhamento 1 new )nteger+=6?=6J.; File ar'uivo 1 new File+2C9LLPrMBprojeto.pd<2.; File)nput&tream ar'uivo)& 1 new File)nput&tream+ar'uivo.; NyteArray#utput&tream saida 1 new NyteArray#utput&tream+.; copia+saida3 ar'uivo)&.; byte,- conteudo&tringAr'uivo 1 saida.toNyteArray+.; &tring nomeAr'uivo 1 ar'uivo.getAame+.; &tring content%ype 1 ar'uivo.to$(L+..openConnection+..getContent%ype+.; &tring conteudoNaseJH 1 NaseJH.encode+conteudo&tringAr'uivo.; if+2content0unOnown2.e'uals+content%ype..* content%ype 1 2application0octetBstream2; 4 endpoint.responderNaseJH+resposta3 id/ncaminhamento3 nomeAr'uivo3 content%ype3 conteudoNaseJH.; 4 0PP P copiar uma stream para outra P @param destino P @param origem P @throws )#/xception P0 public static void copia+#utput&tream destino3 )nput&tream origem.throws )#/xception * byte,- "u<<er 1 new byte,Q6?=-; int 'tdeLida 1 >; while ++'tdeLida 1 origem.read+"u<<er.. 8 >. * destino.write+"u<<er3 >3 'tdeLida.; 4 destino.close+.; origem.close+.;

4 4

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 1, de 1:

" /ecuperando ane;os do WS


Considerando uma plataforma em %ava, os ane=os de cada demanda podem ser recuperados atrav;s do componente Commons HTTP Client e Commons Codec da &pac4e# ?ogo abai=o, tem(se um e=emplo de como recuperar um ane=o utili3ando estes componentes# > e=emplo abai=o utili3ou o commons(4ttpclient vers1o $#1 e o commons(codec 1#$# ?embrando 0ue para conectar(se com sucesso ao servidor ; necess8rio importar os certificados de acesso para a %96 a ser utili3ada )p8gina 10-#
public class AnexosDownload * public static void main+&tring,- args. throws /xception * 5ttpClient client 1 new 5ttpClient+.; 00AutenticaRSo do K&3 a'ui deve ser in<ormado o usuTrio e a senha para acesso ao &)&NAC/A. client.get&tate+..setCredentials+new Auth&cope+2www?."c".gov."r23 HHF3 2&)&NAC/A2.3 new $sernamePasswordCredentials+2usuTrio sis"acen23 2senha2..; 00essa $(L M montada pelo K&3 a'ui M apenas um exemplo de url onde o anexo estT disponUvel Get!ethod get 1 new Get!ethod+2https900www?."c".gov."r0hml0rdrws0anexosC id1=G?>QF2.; get.setDoAuthentication+true.; client.execute!ethod+get.; 00Aome do ar'uivo &tring nomeAr'uivo 1 get.get(esponse5eaders+2ContentBDisposition2. ,>-.get/lements+.,>-.getParameterNyAame+2<ilename2..get:alue+.; 00ConteVdo do ar'uivo )nput&tream ar'uivo 1 get.get(esponseNodyAs&tream+.; get.releaseConnection+.; 4 4

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 17 de 1:

, 9ro2lemas con1ecidos
Configurando o Web Services client com este tutorial foram detectados alguns problemas 0ue podem ocorrer ao reali3ar as c4amadas# &lguns destes problemas s1o descritos a0ui#

5.1 #alidade do 6/7


Web Services utili3am '6? como formato de intercomunica!1o de dados, por;m, ; importante observar 0ue o conteNdo te=to deve obedecer os caracteres permitidos para 0ue n1o ocorra erro no processamento do '6?# >s caracteres v8lidos para um '6? est1o descritos na especifica!1o da W$C ( 4ttpIJJCCC#C$#orgJT2J2000J2EC(=ml(2000100,ZHT( C4ar #

5.2 Invalid element or .apac+e.a.is.encodin .ser.!ean(eseriali&er.onStartC+ild


E=iste um bug cadastrado para este erro em 4ttpsIJJissues#apac4e#orgJ/iraJbroCseJ&' S(275: , mas como o &' S 1#. n1o ; mais evoluMdo, n1o e=iste vers1o com o BK` corrigido# & vers1o 2 ; a mais recente do frameCorT &' S, mas a forma de configura!1o e ar0uitetura s1o totalmente diferentes da vers1o utili3ada neste manual, 0ue ; a primeira# Para corre!1o do erro ; necess8rio alterar uma das classes geradas pelo Eclipse# Procure pela classe com termina!1o +in in'St&bR Esta classe possui um m;todo de iniciali3a!1o das defini!"es dos servi!os ( Einit>peration*esc1R Ha implementa!1o deste m;todo, procure pela iniciali3a!1o de opera!"es do WS 0ue retornem uma cole!1o de ob/etosR &ltere a c4amada ao m;todo void org#apac4e#a=is#description#>peration*esc#set2eturnClass)Class returnClass- colocando a classe simples, e n1o o arraB da classe, como o Eclipse gerou inicialmenteR &ntesI oper.set(eturnClass+"r.gov."c".rdr.siscapws.o"jetos.xsd.Demanda#$%,-.class.; *epoisI
oper.set(eturnClass+"r.gov."c".rdr.siscapws.o"jetos.xsd.Demanda#$%.class.;

5.3 8+ere9s no 3bject:actor2 0it+ an ;6mlElement(ecl $or t+e element


Este erro ocorre ao gerar todos os servi!os do Web Service pelo %&'(WS )p8gina 2-# o problema ocorre ao processar v8rios WS*?s 0ue apontam para o mesmo namespace, 0ue ; o caso do 2*2 Web Services, onde s1o trGs servi!os 0ue compartil4am os mesmos ob/etos# Esta limita!1o est8 relatada em 4ttpsIJJ/a=( Cs#dev#/ava#netJissuesJs4oCEbug#cgiWida,,1 # Kma das solu!"es ; informar um pacote separado para cada servi!o informando o parVmetro OpacTageP com um valor diferente do sugerido pelo WS*?# Esta solu!1o ; pr8tica em nMvel de b&i! com o 6aven, mas o cFdigo gerado ; repetido desnecessariamente# >utra solu!1o, talve3 a mais aplic8vel para este Web Service ; gerar o cliente para cada servi!o, e a cada gera!1o, copiar o ar0uivo O>b/ectAactorB#/avaP para outro lugar e

Configurando Cliente de Web Service HTTPS com Eclipse

P8gina 1: de 1:

ao final, /untar o conteNdo dos ar0uivos O>b/ectAactorB#/avaP gerados para cada servi!o, em apenas um# Essa estrat;gia foi testada, e funcionou corretamente, mantendo a coes1o das classes sem ter 0ue desnecessariamente duplic8(las#