You are on page 1of 20

19/02/2015

WebServicesREST
Seguir@linhadecodigo

HOME

DESENVOLVIMENTO

FRONTEND

BANCODEDADOS

EMDESTAQUE

2.460

Pesquisar

LogIn/Cadastrese

Enviar

3.162seguidores

TODOS

PUBLIQUE
Publicidade

DesenvolvimentoJava

WebServicesREST
Oobjetivodesteartigopartirdeumexemploricoosuficientedearquiteturaorientadaaservioseentofazer
amodelagemedesenvolvimentodosmesmoscomusodeumaabordagemRESTful.
porBrunoLuizPereiradaSilva

49

11

32

Like

REVISTASDEVMEDIA

.netMag120

Easy.netmag39
VERTODAS

Introduo

TOP10ARTIGOS

ASSINE

TOP10AUTORES

ComandosbsicosemSQLinsert,
update,deleteeselect

populareumaexcelenteopoparaintegraoestesistemasdediferentesplataformas.

HTMLBsico

Nesteartigoabordareiosprincipaisconceitosdestetipodeservios,utilizareiumexemplodeleilodo

Excel:Comoverificarseexistevalores
duplicados

MenuemCSSMenudropdownhorizontal
comHTML5eCSS3

Criandoumsistemadecadastroelogin
comPHPeMySql

CalendrioemjQueryCriando
CalendrioscomDatePicker

FormatodosregistrosdoSintegra

SQL:UtilizandooOperadorUNIONe
UNIONALL

CdigoparabackgroundHTMLeCSS

EsteartigofalasobrewebservicesREST.Estalinhadewebservicesvemsetornandocadavezmais

MercadoLivreparailustraroproblema,emostrareidetalhesdaarquiteturaeimplementao.

Definio
REpresentationStateTransfer
Estilodearquiteturadesoftwareparasistemasdistribudos
TermopropostoporRoyFieldingemsuatesededoutorado
Webservicescomaarquiteturadainternet
ExploraoextensadosrecursosdoHTTP

Surgimento
RoyFieldingumdosprincipaisautoresdoprotocoloHTTP,eelepropsemsuatesededoutorado
umestilodearquiteturaquefazextensousodosrecursosoferecidosporesteprotocolo.
EnquantonosserviosWSIosrecursosdoHTTPsomuitopoucoexplorados(inclusiveporqueo

10

Excel:ComparandoListas

SOAPindependentedetransporte),nosserviosRESTumasdasprincipaiscaractersticasa
utilizaodemuitosrecursosdoHTTPparaelaborarumprotocolodecomunicaoconcisoeclaro.

VERTODOS

REST?TCP/IPWSI?OSI
WSI:

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

1/20

19/02/2015

WebServicesREST

Muitasespecificaesantesdasimplementaes
Muitosdocumentosecomplexidadeparadefinirasimplementaes
Modelosemelhanteawaterfall/cascata
REST:
Conjuntoderegrassimples
Especificaescriadasapsusomaduro
EspecificaesporgruposdeestudodoIETF
Modeloincrementaldedesenvolvimentodospadres/boasprticas

Motivao
PorqueimplementarserviosREST?
Protocolosmenoscomplexos
Maispodereflexibilidadenascomunicaes
Arquiteturaamplamentedisponvelnasempresas
Menosoverheaddeprotocolo

QuandoNOimplementarserviosREST?
IntegraescomprodutosfechadosWS*
QuandoWSTransactionfizersentido
QuandoWSSecurityfizersentido
QuandonohouverAPIHTTPrazovelnoservidore/ouclientesalvo

Arquitetura
AarquiteturadoswebservicesWS*sebaseiaemumprotocolobemdefinido,comregrasprecisas
quantoaoformatodosdadostrafegadoseseguindopadresacordadosemconsrciosdegrandes
corporaes.Contrastandocomisso,arquiteturadoswebservicesRESTradicalmentediferente.
PoderamosilustrarasfilosofiasdeprojetodeserviosWS*eRESTcomassentenasaseguir.
WS*:Jtemosoprotocoloeospadres,devemosdefinirosserviosquevamosoferecereos
documentosquedesejamostrocarentreaspartes.
REST:VamosidentificarosrecursosenvolvidoseutilizarextensamenteosrecursosdoHTTPpara
definirumbomprotocolodeinteraocomestesrecursos.

Estilosdeacessoaosservios

REST:ClientesinteragemcomosRecursosatravsderequisiesHTTPGET,PUT,POSTeDELETE
WS*:Clientesinvocamdiferentesoperaes,comconjuntosvariadosdeparmetrosdeentradae
sada

EstiloDeclarativoxImperativo

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

2/20

19/02/2015

WebServicesREST

AURIdeveindicaroquevocestmanipulandoeomtodo(ouverbo)HTTPindicarcomovoc
estmanipulando.Nesteexemplo,aURI/usuario/123456nosindicaqueestamosmanipulandoum
usurioespecfico.SabendoqueestamosusandoomtodoHTTPGET,temosaclaraindicaode
queestamosbuscandoosdadosdesteusurio.Esteestilodeinvocaodeserviospodeser
consideradoDeclarativo.
EmbonsprotocolosREST,ajunodomtodoHTTPcomaURIdorecursojnosindicanamaioria
doscasosqualaoperaosendorealizada.Assim,comumpequenotrechodocabealhoHTTPj
somoscapazesdecompreenderacomunicao.

NoswebservicesWS*,ainformaodaoperaoqueestsendorealizadaficaencapsuladanocorpo
darequisio.MesmoquandoacamadadetransportedasmensagensSOAPHTTP,aURIno
esclarecedeformaalgumaaoperaoenvolvida.Ainformaodosserviosdisponveisficadescrita
porelementosoperationdeumdocumentoWSDL,geralmenteemumformatofazerEssaOperacao.
EstamaneiradedesenvolverwebservicesclassificadacomoImperativa.

Modelagemdosservios
NestaseofalaremosdamodelagemedesenvolvimentodosserviosutilizandoREST.Parailustrar
bemoscenriosabordados,trabalharemosemcimadeumproblemaproposto:umprocessodeleilo
doMercadoLivre.

Apresentaodoproblema
OproblemaquebuscaremosresolverenvolveserviosreferentesaumprocessodeleilodoMercado
Livre.Numleilotpico,umusuriocadastradonositecolocaparavendaumproduto(novoouusado),
definindoumvalorparaolanceinicialeentoaguardapelasofertasdecompraporpartedeoutros
usuriosinteressadosnoproduto.
Apsreceberalgumasofertaspeloproduto,emumdeterminadomomentoovendedordecideaceitara
melhorofertarecebida,eentovendeoprodutoparaocompradorquefezestaoferta,encerrando
nestemomentooleilo.Emseguidavenda,ocorremostrmitesdepagamentoeentregadoproduto
(quenotrataremosaqui)enofinal,vendedorecompradoravaliamumaooutro,oqueessencial
paraosusuriossentiremmaiorseguranaaorealizarnegociaesfuturasdestegnero.
Namodelagemdestaaplicao,quatroentidadesseroutilizadas:Usurio,Item,OfertaeAvaliao.
ModelagemcomRecursos
OpontodepartidadodesenvolvimentocomRESTdefinirquaissoosrecursosenvolvidos,com
basenosrequisitosdosistemaenosserviosquesedesejaoferecer.Nonossoexemplo,estaetapa
nocomplexa.Osrecursosquemanipularemosso:Usuario,Item,OfertaeAvaliacao.
Emboraestaidentificaotenhasidotrivialnodomnioquedefinimos,emalgunscasosesteprocesso
podeserumdosmaiscomplexosnamodelagemdaaplicao.Deumamaneirageral,quantomaisa

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

3/20

19/02/2015

WebServicesREST

aplicaoseaproximadeumCRUD,maisfcilaidentificaodosrecursos.
Paraesteprocessodeleilo,osserviosquedisponibilizaremosseroosdaTabela1:
Servio

Anunciaritem

Buscaritensdo

Descrio

Permitequeumusuriocoloqueumprodutovenda.

Pesquisaositensvendadeumvendedor.

vendedor

Cadastrarusurio

Realizaroferta

Retiraroferta

Buscarofertasdo

Realizaocadastrodeumnovousurionosite.

Permitequeumcompradorfaaumaofertaporumproduto.

Permitearemoodeumaofertaporpartedocomprador.

Pesquisaportodasasofertasfeitassobreumproduto.

item

Buscarmelhor

Buscaamelhorofertafeitaatomomentosobreumproduto.

oferta

Aceitarmelhor
oferta

Avaliarusurio

Permitequeumvendedoraceiteamelhorofertafeitasobreoseu
produto,ecomissoencerreoleilodomesmo.

Realizaaavaliaodeumusurioporpartedeoutrousurio,apso
trminodoprocessodecompra.

Buscaravaliaes

Pesquisaportodasasavaliaesrecebidasporumusurio.

dousurio
Tabela1.Serviosoferecidosparainteraocomoprocessodeleilo.

ProtocolodecomunicaoREST
Tendodefinidoosrecursoseosserviosqueprecisamosoferecer,necessriodefiniras
manipulaespossveissobreosrecursosexistentes.Estaetapaatraduodeoperaesde
negcioeminteraesdiretassobreusurios,tens,ofertaseavaliaes.Estatraduofeita
explorandoosrecursosdoHTTPnoslevaraumconjuntodeURIsqueaaplicaoofereceparaos
clientes.
ParaelaborarumbomprotocolodecomunicaoREST,devemospensaremalgumasquestes
importantes,comoestas:
Quaissoosrecursos?
QuaissoasURIs?
Quaissoosformatosmanipulados?
QuemtodosHTTPsoaceitosemcadaURI?
QuestatusHTTPdeveserretornadoemcadasituao?
QuecabealhosHTTPsorelevantesemcadasituao?
AdefiniodasURIsedosmtodosHTTPaceitosprimordialparaumprotocoloRESTcomclarezae
defcilutilizaoeextenso.AolerasURIsjdevemossercapazesdeentenderquaissoos
recursospresentesnasmesmas,eocasamentodelascomosmtodosHTTPdeveserintuitivo.
ATabela2descrevetodasasURIsdisponveisnaaplicaoequaismtodosHTTPpodemser
invocadosemcadaumadelas.Almdisso,soespecificadososrecursosmanipuladosporcada
requisioeoefeitoqueumadeterminadachamadaexercesobreosrecursosexistentes.
URI

Mtodo

Formato

GET

Item

Efeito

Buscaumitem.

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

4/20

19/02/2015

WebServicesREST
/item/{id}
PUT

GET
/item/{id}/ofertas

Item

Atualizaumitem.

Coleode

Buscaofertasfeitassobreumitem.

ofertas

POST

Oferta

Adicionaofertaaumitem.

GET

Oferta

Buscaumaoferta.

PUT

Oferta

Atualizaumaoferta.

DELETE

Removeumaoferta.

POST

Usuario

Cadastraumusurio.

GET

Usuario

Buscaumusurio.

PUT

Usuario

Atualizaumusurio.

/oferta/{id}

/usuario

/usuario/{id}

/usuario/{id}/avaliacoes

GET

GET

Coleode

Buscaasavaliaesrecebidasporum

avaliaes

usurio.

Coleode

Buscaostensanunciadosporum

tens

determinadousurio.

POST

Item

Usuriocolocanovoitemvenda.

/avaliacao/{id}

GET

Avaliao

Buscaumadeterminadaavaliao.

/avaliacao/de/{id}/para/{id}

POST

Avaliao

Realizaodaavaliaodeum

/usuario/{id}/itens

usuriosobreoutro.
/services

GET

Coleode
URIs

ConsultaURIsemtodosHTTP
disponveisparaacesso.

Tabela2.URIsdeacessoarecursosemtodosHTTPaceitosporcadaumadelas

ImplementaocomaJAXRS(JavaAPIforRESTFulWebServices)
ParaoferecermelhorsuporteaserviosRESTemJava,foicriadaaJSR311.Vejaosobjetivosdesta
JSR.
ComaJAXRS,umrecursowebimplementadocomoumaclasseRecursoeasrequisiesso
tratadaspormtodosdamesma.UmaclasseRecursosimplesmenteumPOJOcontendoanotaes
daJAXRSparaindicarosmapeamentoseoperaesexistentes.

Ciclodevidaeambiente
Porpadro,umanovainstnciadaclasseRecursocriadaparacadarequisioqueleRecurso.
Inicialmenteoconstrutorinvocado,dependnciasnecessriassoinjetadas,eentoomtodo
adequadoexecutado.Apsestasetapas,oobjetoficadisponvelparaocoletordelixo.
AsclassesRecursosoinstanciadaspeloruntimeJAXRSedevempossuirpelomenosumconstrutor
pblico.Umconstrutorpblicopodeincluirparmetroscomumadasseguintesanotaes:@Context,
@HeaderParam,@CookieParam,@MatrixParam,@QueryParame@PathParam.Estasanotaes
realizaminjeodedependnciasrelativasaserviosREST,esoapresentadasnaTabela3.

Anotao

Descrio

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

5/20

19/02/2015

WebServicesREST
InjetaumainstnciaderecursoscomoUriInfo,HttpHeaders,ServletConfig,

@Context

ServletContext,HttpServletRequesteHttpServletResponse.Outros
recursosdeJavaEEpodemseropcionalmenteoferecidosporuma
implementaodestaJSR.

@HeaderParam

ExtraiovalordeumcabealhodarequisioHTTP.

@CookieParam

Extraiovalordeumcookiepresentenarequisio.

Extraiovalordeparmetrosenviadosnoformatochave=valordentrode
@MatrixParam

umsegmentodaURI.Exemplo:
/usurio/123/itenscategoria=eletronicoslimitePreco=1000

@QueryParam

Extraiovalordeumparmetrofornecidonaquerystringdarequisio.

@PathParam

ExtraiovalordeumparmetroenviadodentrodaURI.

Tabela3.AnotaesdaJAXRSparainjeodedependncias
ComexceodoContext,estesparmetrossoenviadosdentrodeURIs,querystrings,cabealhos
HTTPecookies.Sendoassim,suarepresentaonacamadadetransportecomoString.Entretanto,
podemoscolocarestasanotaessobreparmetrosquenosoString,parajrecebermososdados
convertidosemumformatomaisadequadoparanossamanipulao.Tiposdeparmetrosquepodem
sermarcadoscomestasanotaesso:
Tiposprimitivos
ClassesquepossuamumconstrutortendoumanicaStringcomoparmetro
ClassesquepossuamummtodoestticovalueOf()recebendoumaStringcomoparmetro
List<T>,Set<T>ouSortedSet<T>,ondeTsatisfazacondio2oua3.
Aseguirumexemplodeusodestasanotaes:
@GET
@Path("{usuarioId}")
publicResponsebuscarUsuario(@PathParam("usuarioId")StringusuarioId){
Usuariousuario=usuarioService.buscar(usuarioId)
Responseresposta=Response.ok(usuario).build()
returnresposta
}
EsteexemplomostracomopoderiaserummtododebuscadeusuriorecebendoumaURI
/usuario/{usuarioId},como/usuario/123.OparmetrousuarioIddomtodopoderiaserintou
Integer,casooIDdousuriofosseumnmerointeiro.AimplementaodaAPIfariaaconversodo
parmetroenviadonaURIparaotipoespecificadonomtodo.

RequisiesaosmtodosdeRecursos
UmmtododeRecursoumaoperaoexpostacomoumservioREST.Estesmtodosficamem
umaclasseRecursoesoanotadoscomomtodoHTTPassociadooperaoemquesto.O
conjuntodeanotaesquedefineosmtodosHTTPquepodemserutilizadosnasoperaes:
@GET,@POST,@PUT,@DELETE,@HEADe@OPTIONS.
MtodosdeRecursosqueseroexpostosparaosclientesdevemserpblicos.Implementaesda
JSRdevemalertarosdesenvolvedorescasoencontremmtodosnopblicosquesejammarcados
comalgumadestasanotaesdemtodoHTTP.
Osparmetrosdosmtodossoconvertidosdarequisiodeacordocomasanotaesapresentadas
naTabela3.UmmtododeRecursopodeternomximoumparmetronoanotado.Esteparmetro
noanotadoserobtidodocorpodarequisio.
Aobtenodeparmetrosdocorpodarequisiosfazsentidoquandoestamosfalandode
requisiesPOSTePUT.EstessoosnicosmtodosHTTPquepossuemumcorpo,equasesempre
soutilizadosemoperaesdecriaoeatualizaodeRecursos,respectivamente.Otrechoaseguir
apresentaumexemplodemtodoquereceberequisiesPOSTparacadastrodeusurios.

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

6/20

19/02/2015

WebServicesREST

@POST
publicResponsecadastrarUsuario(Usuariousuario){
usuario=usuarioService.cadastrar(usuario)
try{
returnResponse.created(newURI(usuario.getCodUsuario())).build()
}catch(URISyntaxExceptione){thrownewRuntimeException(e)}
}

RespostasdosmtodosdeRecursos
AsrespostasaosmtodosdeRecursospodemserdeclaradascomovoid,Responseouqualquer
outraclasseJava.Retornarvoidimplicaemenviarumarespostacomcorpovazio,oquemapeado
emumstatusHTTP204(NoContent).EstestatusutilizadopelaJSRparaindicarquearequisio
tevesucesso,earespostanopossuicorpo.
ColocarumaclasseJavacomotipoderespostafarcomqueoobjetoretornadosejacolocadono
corpodaresposta.UmobjetonuloenviadonarespostaimplicaremstatusHTTP204eumobjeto
nonuloimplicarnostatusHTTP200.
AclasseResponsepodesercolocadacomotipoderetornodosmtodoscasodesejemostermais
controlesobrearesposta.Comestaformaderetorno,conseguimosespecificarcabealhos,corpo,
status,cookiesemaisalgumasinformaesdarespostaenviada.
AtestemomentonomencionamosnadaarespeitodoformatodosRecursosmanipulados.
Mostramosexemplosdebuscaecadastrodeusurios,masficouexplcitanosexemplosapenasa
manipulaodeobjetosJava.Aquestodosformatosmuitoimportanteecobertanaseo
Manipulaodediferentesformatos.

Tratamentodeerroseexcees
Comopadro,quandoocorreumaexceoduranteumachamadaREST,oclienterecebeumstatus
HTTP500(InternalServerError).Emmuitassituaesestestatuspodenosersatisfatrio,poisno
fornecemuitainformaosobreoerroqueocorreunoservidor.PararesolveresteproblemaaJSR
311permitequearespostasejapersonalizadaemcasodeexcees.Podemosfazerestecontrolede
duasformas.
Aprimeiraformacomumaexceoespecial.Bastadispararumauncheckedexception
javax.ws.rs.WebApplicationException.CriandoestaexceopodemospassarostatusHTTPeum
objetoResponse,permitindototalcontroledarespostaqueserenviadaparaousurio.
Porm,emumaaplicaograndemuitocomumtermosolanamentodeoutrasexceesem
camadasinferiores.ParaestasituaoaJSR311permitequesejacriadaumaclasseparamapeara
respostacorrespondenteacadaexceo.Estemapeamentoseriaconhecidoapenaspelacamadade
serviosREST.
Aclassedemapeamentodeveimplementarainterfacejavax.ws.rs.ext.ExceptionMappereser
anotadacom@Provider.Apartirda,quandoaexceoespecificadafordisparadaocontrolevai
passarparaomtodotoResponse()destaclasse.Estemtodopoderconstruirarespostadeacordo
comaexceo,quepassadacomoparmetro.
Sobreasegundaformadetratarexceesvalecitarqueelaaindaestsendoimplementadanaverso
0.8daespecificao,eestsujeitaamodificaesatafinalizaodaJSR.
Otrechoaseguirapresentaumexemplodemapeamentodeexceoparaumarespostacomstatus
HTTPcustomizado.
@Provider
publicclassItemJaVendidoExceptionMapperimplementsExceptionMapper{
publicResponsetoResponse(ItemJaVendidoExceptione){
returnResponse.status(Response.Status.GONE).build()
}
}

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

7/20

19/02/2015

WebServicesREST

Manipulaodediferentesformatos
UmadascapacidadesmaisinteressantesquetemosnaJSR311adetratarfacilmentediferentes
formatosnosnossosservios.Somoscapazesdereceberegerardadosemdiferentestiposde
contedo,semnusparaosdesenvolvedores.
OsformatosXMLeJSONjestodisponveisnoJersey(implementaoderefernciadaJSR).Alm
disso,aJSRpermitequesejaoferecidoosuporteaqualquerformato,atravsdeclassesProvider.
ClassesProvidersodesenvolvidasparapermitiraleiturae/ouescritadedeterminadostiposde
contedo(ContentTypes).UmaclasseProviderimplementaasinterfacesMessageBodyReadere
MessageBodyWriterparaoferecersuporteaotipodecontedoqueseprope.Poderamoster,por
exemplo,umProviderquesoubessemanipularrecursoscomformatomp3emumaaplicao
multimdia.
ClassesRecursopodemusarasanotaes@ConsumeMimee@ProduceMimeparadeclararquais
soostiposdecontedoqueelasgerameostiposdecontedoqueelasaceitamreceber,
respectivamente.Casonenhumtipodecontedosejadeclarado,assumesequequalquertipode
contedo(*/*)aceito.
OtrechoaseguirapresentaumexemplodeusodestasanotaesnaclasseUsuarioResource.Neste
exemplo,declaramosqueaclasseaceitaegeracontedonosformatostext/xmleapplication/json.
@ConsumeMime({"text/xml","application/json"})
@ProduceMime({"text/xml","application/json"})
publicclassUsuarioResource{}
Nesteexemplo,colocamosasanotaessobreaclasse.Estasanotaestambmpodemser
colocadassobremtodos.Casoasanotaessejamcolocadassobreaclasseetambmsobreum
mtodo,aanotaosobreomtodoaquevale.
Otrechoabaixomostraumexemplodeanotaessobreaclasseesobreummtodo.Nesteexemplo,
declaramosqueaclasseaceitaostiposdecontedotext/xmleapplication/jsonemtodososseus
mtodos,comexceodomtodobuscarUsuario().Nestemtododeclaramosqueproduzimosapenas
contedoemformatotext/xml.OmtodoatualizarUsuario()herdaasdeclaraesfeitasnaclasse,
portantoaceitacontedoemtext/xmleapplication/json.
@Path("usuario")
@ConsumeMime({"text/xml","application/json"})
@ProduceMime({"text/xml","application/json"})
publicclassUsuarioResource{
@GET
@Path("{usuarioId}")
@ProduceMime("text/xml")
publicResponsebuscarUsuario(@PathParam("usuarioId")StringusuarioId){
Usuariousuario=usuarioService.buscar(usuarioId)
Responseresposta=Response.ok(usuario).build()
returnresposta
}
@PUT
@Path("{usuarioId}")
publicResponseatualizarUsuario(Usuariousuario){
usuarioService.atualizar(usuario)
returnResponse.ok().build()
}
}
importantemencionarcomofuncionaestetratamentodostiposdecontedo.Quandoumclientefaz
umarequisioHTTP,elepodeespecificarocabealhoAccept.Estecabealhoinformaaoservidor
quaissoostiposdecontedoqueoclienteaceitareceber.Seoclientenoespecificareste
cabealho,ovalorassumidodomesmo*/*,oqueindicaqueoclienteaceitaqualquertipode

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

8/20

19/02/2015

WebServicesREST

contedo.
AoreceberumarequisioHTTP,oruntimeJAXRSircompararalistadetiposenviadosno
cabealhoAcceptcomalistadetiposdecontedoregistradosparaomtodoinvocado.Nesta
comparao,asseguintesregrasseroaplicadas:
Casoexistaapenasumtipodecontedoemcomumentreasduaslistas,esteserotipode
contedoenviado
Casoexistamaisdeumtipodecontedoemcomumentreaslistas,ocontedoserenviado
noformatoqueaparecerprimeironalistaregistradanoservidor.Seomtododeclarougerao
detext/xmleapplication/json(nestaordem)eoclienteaceitaambosostipos,ocliente
recebertext/xml
Sealistadetiposdecontedooferecidapeloservidornocontivernenhumdostiposqueo
clienteafirmouaceitar,oruntimeJAXRSenviaumarespostadefalhacomstatusHTTP415
(UnsupportedMediaType).
Comestesexemplos,mostramosacapacidadedegerardiferentesformatosemnossosservios,sem
quesejanecessriotratarissoexplicitamentepelanossaaplicao.Adeclaraodostiposde
contedoatravsdasanotaes@ConsumeMimee@ProduceMimesuficienteparaqueoruntime
JAXRSfaaotratamentocorreto.
UmaltimaquestoqueprecisamosabordarnestecontextocomoindicarparaaJAXRScomodeve
serfeitoomapeamentodenossasclassesemXMLs.AsimplementaesdaJSRsoobrigadasa
suportarousodeJAXB(JavaArchitectureforXMLBinding)naconversodeJavaparaXMLede
XMLparaJava.OJAXBumdoscomponentesdoJavaEE5efoiincludotambmnaverso6do
JavaSE.EleaformapadrodemapeamentoentreclassesJavaedocumentosXMLnaJSR311.
ParautilizaroJAXBnomapeamentodenossasclasses,aopomaissimplesutilizaraanotao
@XmlRootElementsobreasmesmas.Aofazerisso,oJAXBfaraconversodaclasseedosseus
atributosemumdocumentoXMLcujoelementorootseronomedaclasse(comeandopor
minscula).Oselementosfilhosseroosatributosdaclasse,seguindoanomenclaturadamesma.
Casosejadesejado,possvelespecificarnaanotao@XmlRootElementumnomedeelemento
XMLdiferentedonomedaclasse.PodemostambmmodificaroselementosXMLdosatributosda
classeusandoaanotao@XmlElement.OJAXBnospermitecustomizarbastanteosmapeamentos
realizados,seassimquisermos.Otrechoabaixoapresentaumexemplonoqualmapeamosaclasse
AvaliacaoparaumXMLcomelementosemingls.NoentraremosemmaisdetalhessobreoJAXB
nestemomento,poisistofugiriadofocodoartigo.
@XmlRootElement(name="feedback")
publicclassAvaliacao{XmlElement(name="feedbackCode")
privateStringcodAvaliacao
@XmlElement(name="rater")

privateUsuarioavaliador
@XmlElement(name="positive")
privatebooleanpositiva
@XmlElement(name="comment")

privateStringcomentario
}

MapeamentodeURIsemtodosHTTPemclassesRecursoeseusmtodos
UmadasprincipaisvantagensnousodaJSR311/Jerseyeliminardonossodesenvolvimentoa
validaoderequisieseomapeamentodasmesmasemclassesemtodosquedevemprocess
las.IstoimplicaemobteraURIeomtodoHTTPdassolicitaeseconferirseexistealgumdos
nossosserviosquesaibatratla.Almdisso,antesdeinvocarosserviosemquesto,precisamos
extrairdasURIsosparmetrosquetenhamsidoenviadosnasmesmas.
Aanotao@Pathpodesercolocadaemclassesemtodos.Quandoacolocamossobreumaclasse,

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

9/20

19/02/2015

WebServicesREST

estamosassociandoaclasseaumprefixodeURI.Estaanotaofoiutilizadaanteriormentenoartigo
paraassociaroprefixo/usuariodanossaaplicaoclasseUsuarioResource.
Colocamosaanotao@Pathsobremtodosparaformarocaminhocompletodosnossosservios.
Juntandoosvaloresdaanotao@Pathsobreosmtodoscomovalordaanotaosobreaclasse,
temosalistadeURIsdisponveisnaclasseRecursoemquesto.
Acolocaodasanotaes@GET,@POST,@PUT,@DELETE,@HEADe@OPTIONScomplementa
omapeamentodeURIs.Comestasduasinformaessobrecadamtodo,conseguimosmapear
precisamentecadasolicitaonaclasseenomtodoquedevemtratla.
MostraremosnaprximaseocomoficaousodaJSR311nodesenvolvimentodosserviosde
leilo.

AplicandoaJSR311eoJerseynosserviosdeleilo
NestaseomostraremoscomousaroJerseyparaimplementarosserviosdoprocessodeleilo.
Devidoslimitaesdeespao,escolhemosapenasumapartedosservios,masdeformaqueseja
possvelilustrarcomclarezaasdiferenas.
AprimeiraetapanecessriaaconfiguraodoJerseynoprojeto.Adistribuiobinriaestvelmais
recentenomomentodaescritadesteartigoa0.7.Estadistribuiopodeserobtidanositedoprojeto.
DevemosmapeartodososprefixosdeURIsdosnossosserviosparaumServletdoJersey.Otrecho
abaixomostraumweb.xmlconfiguradocomestemapeamento.Nanossaaplicao,comotodasas
URIssodeserviosREST,mapeamostodaaaplicao(/*)paraoServletdoJersey.
<?xmlversion="1.0"encoding="UTF8"?>
<webapp>
<servlet>
<servletname>JerseyWebApplication</servletname>
<servletclass>com.sun.ws.rest.spi.container.servlet.ServletContainer</servletclass>
<initparam>
<paramname>com.sun.ws.rest.config.feature.Redirect</paramname>
<paramvalue>true</paramvalue>
</initparam>
<initparam>
<paramname>com.sun.ws.rest.config.feature.ImplicitViewables</paramname>
<paramvalue>true</paramvalue>
</initparam>
<loadonstartup>1</loadonstartup>

</servlet>
<servletmapping>
<servletname>JerseyWebApplication</servletname>
<urlpattern>/*</urlpattern>
</servletmapping>

</webapp>
AlmdaconfiguraodoServlet,precisamosadicionaralgumasbibliotecasparautilizaroJersey.O
conjuntomnimodebibliotecasquedevemsercolocadasnaaplicaoincluiojersey.jar,jsr311api.jar
easm.jar.Estasbibliotecasemaisalgumasdependnciasestopresentesnodiretrio/libda
distribuiobinriadoJersey.
SenoestiverusandoJavaSE6ouJavaEE5,voctambmprecisaradicionaroJAXBaoprojeto.
UtilizandoumservidordeaplicaesJavaEE5easbibliotecaspresentesnadistribuiobinriado
projeto,voctemagarantiadetertodasasdependnciasnecessrias.

Desenvolvimentodosservios
http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

10/20

19/02/2015

WebServicesREST

Mostraremosagoracomopodeserfeitaaimplementaodealgunsserviosdoprocessodeleilo
comousodoJersey.Somenteumsubconjuntodosserviosserapresentadonesteartigo,masa
implementaocompletapodeservistanocdigofonte.
Comearemospelosservioscorrespondentesaoprefixo/usuarioedepoisfalaremostambmsobre
osserviosdoprefixo/avaliacao.ATabela4listaosserviosqueapresentaremosnesteartigo.
URI

Mtodo

Formato

/usuario

POST

Usuario

Cadastraumusurio.

GET

Usuario

Buscaumusurio.

PUT

Usuario

Atualizaumusurio.

Efeito

/usuario/{id}

/usuario/{id}/avaliacoes

GET

GET

Coleode

Buscaasavaliaesrecebidaspor

avaliaes

umusurio.

Coleode

Buscaositensanunciadosporum

itens

determinadousurio.

POST

Item

Usuriocolocanovoitemvenda.

/avaliacao/{id}

GET

Avaliao

Buscaumadeterminadaavaliao.

/avaliacao/de/{id}/para/{id}

POST

Avaliao

/usuario/{id}/itens

Realizaodaavaliaodeum
usuriosobreoutro.

AlistagemabaixoapresentaaclasseUsuarioResource.EstaumadasclassesRecursodanossa
aplicaoenelaestotodososserviosdoprefixo/usuario.Aclassefoianotadacom
@Path(usuario),oquefazaassociaodamesmacomoprefixocitado.Almdisso,aclasse
possuiasanotaes@ConsumeMimee@ProduceMime,quenestecasodeclaramqueosservios
damesmasocapazesdeconsumiregerarcontedonosformatostext/xmleapplication/json.
@Path("usuario")
@ConsumeMime({"text/xml","application/json"})
@ProduceMime({"text/xml","application/json"})
publicclassUsuarioResource{

privateItemServiceitemService
privateUsuarioServiceusuarioService
privateAvaliacaoServiceavaliacaoService
publicUsuarioResource(){
this.itemService=ServiceFactory.getItemService()
this.usuarioService=ServiceFactory.getUsuarioService()
this.avaliacaoService=ServiceFactory.getAvaliacaoService()
}
@GET
@Path("{usuarioId}")
publicResponsebuscarUsuario(@PathParam("usuarioId")StringusuarioId){
Usuariousuario=usuarioService.buscar(usuarioId)
if(usuario==null){

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

11/20

19/02/2015

WebServicesREST

returnResponse.status(HttpServletResponse.SC_NOT_FOUND).build()
}
Responseresposta=Response.ok(usuario).build()
returnresposta
}
@POST
publicResponsecadastrarUsuario(Usuariousuario){
usuario=usuarioService.cadastrar(usuario)
try{
returnResponse.created(newURI(usuario.getCodUsuario())).build()
}catch(URISyntaxExceptione){thrownewRuntimeException(e)}
}
@PUT
@Path("{usuarioId}")
publicResponseatualizarUsuario(Usuariousuario){
usuarioService.atualizar(usuario)
returnResponse.ok().build()
}
@POST
@Path("{usuarioId}/itens")
publicResponsecadastrarItem(@ContextUriInfouriInfo,
@PathParam("usuarioId")StringusuarioId,Itemitem)
throwsURISyntaxException{
Usuariousuario=newUsuario(usuarioId)
item=itemService.cadastrar(item,usuario)
URIuriItem=newURI(uriInfo.getBaseUri()+"item/"+item.getCodItem())
returnResponse.created(uriItem).build()
}
@GET
@Path("{usuarioId}/itens")
publicResponsebuscarItensDoUsuario(@PathParam("usuarioId")StringusuarioId){
//Verificaseousurioexiste
if(this.usuarioService.buscar(usuarioId)==null){
returnResponse.status(Status.NOT_FOUND).build()
}
Listitens=itemService.buscarPorVendedor(newUsuario(usuarioId))
returnResponse.ok(newItensUsuario(itens)).build()
}
@GET
@Path("{usuarioId}/avaliacoes")
publicAvaliacoesUsuario
buscarAvaliacoesDoUsuario(@PathParam("usuarioId")StringusuarioId){
Usuariousuario=newUsuario(usuarioId)

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

12/20

19/02/2015

WebServicesREST

Listavaliacoes=avaliacaoService.buscarPorUsuario(usuario)
returnnewAvaliacoesUsuario(avaliacoes)
}
}
Oprimeiroservioodebuscadeusurio.Estemtodofoianotadocom@Path({usuarioId}).O
casamentodaanotaosobreomtodocomaanotaosobreaclasseespecificaqueestemtodo
respondearequisiesparaaURI/usuario/{usuarioId}.Comoomtodotambmfoianotadocom
@GET,sabemosqueassolicitaesHTTPGETpara/usuario/{usuarioId}serotratadasporeste
mtodo.Importanterepararnousodaanotao@PathParamparainjetarnoparmetrousuarioIdo
valorqueveionaURI.
Narespostaaestasolicitao,retornamosostatusHTTP200(OK)eosdadosdousurionocorpoda
resposta.Casoousurionotenhasidoencontrado,retornamosstatus404(NotFound).Alistagem
abaixomostraaclasseUsuario,quemanipuladaporalgunsserviosnaclasseUsuarioResource.
Porsimplicidademostramosapenasadeclaraodaclassecomosatributos.
@XmlRootElement
publicclassUsuario{
privateStringcodUsuario
privateStringnome
privateStringlogin
privateStringemail
privateItem[]items
privateOferta[]ofertas
privateAvaliacao[]avaliacoes
}
OsegundoserviopresenteemUsuarioResourceodecadastrodeusurio.Comonocolocamos
nenhumaanotao@Pathsobreestemtodo,eleestassociadoURIdaclasse(/usuario).O
mtodofoianotadocom@POST,entoelerespondessolicitaesPOSTnaURIcitada.Oparmetro
contendoosdadosdousurionorecebeunenhumaanotao,oquesignificaqueeleobtidodo
corpodasolicitao.Comoomtododecadastrodeusurionotemasanotaes@ConsumeMime
e@ProduceMime,eleherdaasdeclaraesfeitassobreaclasse.Sendoassim,podemoscadastrar
usuriosusandotext/xmlouapplication/json.Narespostacriaodousurionsenviamoso
statusHTTP201(Created),colocandonoheaderLocationaURIdonovousurio.
OmtododeatualizaodeusuriorecebesolicitaesPUTem/usuario/{usuarioId}.Osdadosdo
usuriotambmsoconsumidosdocorpodasolicitao,easoperaescomsucessoresultamno
enviodostatusHTTP200.
Nomtododecadastraritens,usamosaanotao@PathparaassociaroservioURI
/usuario/{usuarioId}/itens.Usamosaanotao@PathParamparaextrairdaURIoIDdousurio
envolvido.Usamostambmaanotao@ContextparainjetaraclasseUriInfo,quenosfornece
informaessobreaURIdeacessoaosservios.Nofinal,usamosaUriInfoparacolocarnoheader
Locationocaminhoabsolutodeacessoaoitemrecmcriado.AlistagemabaixomostraaclasseItem,
manipuladanesteservio.
@XmlRootElement
publicclassItem{
privateStringcodItem
privateStringnome
privateStringdescricao
privateBigDecimalvalorInicial
privatebooleannovo
privatebooleanvendido
}
Nomtododebuscaritensdousuriotemosoprimeiroservioquemanipulacolees.Estemtodo
tratadesolicitaesGETURI/usuario/{usuarioId}/itens.Pararetornaralistadeitensdousuriofoi
criadaaclasseItensUsuario,quesimplesmentecontmalista.Alistagemaseguirapresentaa
declaraodestaclasse.

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

13/20

19/02/2015

WebServicesREST

@XmlRootElement
publicclassItensUsuario{

privateListitem
publicItensUsuario(){}
publicItensUsuario(Listitens){this.item=itens}
}
Omtododebuscaravaliaesdousurioestruturalmentesemelhanteaodebuscaritens.Foicriada
aclasseAvaliacoesUsuariopararetornaralistadeavaliaes.Comoestamuitosemelhante
ItensUsuario,elaseromitida.Paraimplementarosserviosdoprefixo/avaliacaofoicriadaaclasse
AvaliacaoResource.Estaclassepodeservistanalistagemaseguir.Temosaanotao@Path
registrandoaURIdesejadaetambmasanotaes@ConsumeMimee@ProduceMimedeclarando
quemanipulamostext/xmleapplication/json.
@Path("avaliacao")
@ConsumeMime({"text/xml","application/json"})
@ProduceMime({"text/xml","application/json"})
publicclassAvaliacaoResource{

privateAvaliacaoServiceavaliacaoService
publicAvaliacaoResource(){
this.avaliacaoService=ServiceFactory.getAvaliacaoService()
}
@GET
@Path("{avaliacaoId}")
publicResponsebuscarAvaliacao(@PathParam("avaliacaoId")StringavaliacaoId){
Avaliacaoavaliacao=avaliacaoService.buscar(avaliacaoId)
if(avaliacao==null){
returnResponse.status(HttpServletResponse.SC_NOT_FOUND).build()
}
returnResponse.ok(avaliacao).build()
}
@POST
@Path("de/{avaliador}/para/{avaliado}")
publicResponseavaliarUsuario(@ContextUriInfouriInfo,
@PathParam("avaliador")Stringavaliador,
@PathParam("avaliado")Stringavaliado,Avaliacaoavaliacao)
throwsURISyntaxException{
UsuariousuarioAvaliado=newUsuario(avaliado)
avaliacao=avaliacaoService.cadastrar(avaliacao,usuarioAvaliado)
URIuri=newURI(uriInfo.getBaseUri()+"avaliacao/"+avaliacao.getCodAvaliacao())
returnResponse.created(uri).build()
}
}
Oprimeiroserviodestaclasseodebuscadeavaliao,quemuitosemelhanteaoserviode
buscadeusurioquevimosanteriormente.Esteservioficoumapeadoem/avaliacao/{avaliacaoId},
recebendosolicitaesGET.
Oserviodeavaliarusuriomaisinteressante.ExtramosdoisparmetrosdaURIeconsumimosum
recursodocorpodasolicitao.AURI/avaliacao/de/{avaliador}/para/{avaliado}umbomexemplo
daliberdadequetemosnadefiniodasURIs.Podemosmoldlasparaaumentaraclarezadas
operaes.Istofacilitaaaproximaodosservioscomonossodomniodaaplicao.

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

14/20

19/02/2015

WebServicesREST

CriaodeclientesJavaparaosserviosREST
ExpusemoscombomnveldedetalheaimplementaodeserviosRESTdoladodoservidor.Para
permitirumavisocompletadacomunicao,muitoimportantefalartambmdeclientesRESTful.
Umavezquejtemosoprotocoloestabelecido,opapeldoclientemanipularassolicitaese
respostasnoformatoacordadocomoservidor.Paraexemplificarcomopodeserfeitoissodoladodo
cliente,apresentamosnalistagemabaixoaclasseOfertaTestREST,querealizaumasolicitaopara
cadastrodeumaofertasobreumitem.Ocdigodestetestefoifeitoparafacilitarailustraodoque
estsendofeito.Esteomotivodeimprimiroscabealhosecorpotantodarequisiocomoda
respostaHTTP.
publicclassOfertaTestRESTextendsTestCase{

publicvoidtestCadastro()throwsHttpException,IOException{
//Criamosousurio
Usuariousuario=newUsuario()
usuario.setNome("UsuarioArtigo")
usuario.setEmail("usuario@test.com")
usuario.setLogin("artigo"+System.currentTimeMillis())
UsuarioServiceusuarioService=ServiceFactory.getUsuarioService()
usuario=usuarioService.cadastrar(usuario)

//Criamosoitem
Itemitem=newItem()
item.setDescricao("ItemtesteArtigo"+System.currentTimeMillis())
item.setNome("Iphone")
item.setNovo(true)
item.setValorInicial(newBigDecimal(0))
item.setVendido(false)
ItemServiceitemService=ServiceFactory.getItemService()
item=itemService.cadastrar(item,usuario)

//EagoraacriaodaOfertademaneiraRESTFul
Ofertaoferta=newOferta()
oferta.setDataModificacao(newDate())
oferta.setItem(item)
oferta.setOfertante(usuario)
oferta.setValor(newBigDecimal(111.22).setScale(2,RoundingMode.HALF_UP))

//Montandorequisiocomocommonshttpclient
HttpClientclient=newHttpClient()
PostMethodmethod=
newPostMethod("http://localhost:8080/item/"+item.getCodItem()+"/ofertas")

//GeraodeXMLscomoXStream
XStreamxstream=newXStream()
xstream.alias("oferta",Oferta.class)
xstream.alias("ofertante",Usuario.class)
xstream.alias("item",Item.class)
StringofertaXml=xstream.toXML(oferta)
System.out.println(ofertaXml)

//Definindocorpodarequisio
StringRequestEntityrequestEntity=
newStringRequestEntity(ofertaXml,"text/xml","UTF8")
method.setRequestEntity(requestEntity)

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

15/20

19/02/2015

WebServicesREST

//Hereitgoes...
intstatusCode=client.executeMethod(method)
//StatusHTTPdeveser201Created
assertEquals(HttpServletResponse.SC_CREATED,statusCode)
System.out.println("\n####REQUISIO####\n")
System.out.println(method.getName()+""+method.getPath())
Header[]headersRequest=method.getRequestHeaders()
for(Headerheader:headersRequest){
System.out.println(header.getName()+":"+header.getValue())
}
method.getRequestEntity().writeRequest(System.out)
System.out.println("\n\n####RESPOSTA####\n")
System.out.println(method.getStatusLine().getHttpVersion()+
""+method.getStatusLine().getStatusCode())

Header[]headersResponse=method.getResponseHeaders()
for(Headerheader:headersResponse){
System.out.println(header.getName()+":"+header.getValue())
}
System.out.println(method.getResponseBodyAsString())
}
}
OformatodarequisioHTTPgeradaporestaclassepodeservistonaprimeiralistagemabaixo.Na
listagemseguintepodeserconferidooformatodarespostaHTTPaestasolicitao.Aterceiralistagem
destasequnciamostraoformatodarespostabuscadeofertasdeumdeterminadoitem.
####REQUISIO####
POST/item/13c017ba7c0144aa9a0bb815a9ea298f/ofertas
UserAgent:JakartaCommonsHttpClient/3.0.1
Host:localhost:8080
ContentLength:596
ContentType:text/xmlcharset=UTF8
<oferta>
<valor>111.22</valor>
<dataModificacao>2008092810:36:54.642BRT</dataModificacao>
<item>
<codItem>13c017ba7c0144aa9a0bb815a9ea298f</codItem>
<nome>Iphone</nome>
<descricao>ItemtesteTechTalk1222609014628</descricao>
<valorInicial>0</valorInicial>
<novo>true</novo>
<vendido>false</vendido>
</item>
<ofertante>
<codUsuario>fc6104adb9a54b2d9085a186083b9c2d</codUsuario>
<nome>UsuarioTechTalk</nome>

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

16/20

19/02/2015

WebServicesREST

<login>techtalk1222609014475</login>
<email>usuario@test.com</email>
</ofertante>
<vencedora>false</vencedora>
</oferta>
####RESPOSTA####
HTTP/1.1201
Server:ApacheCoyote/1.1
Location:http://localhost:8080/item/13c017ba7c0144aa9a0bb815a9ea298f/ofertas
ContentLength:0
Date:Sun,28Sep200813:36:55GMT
AimplementaodassolicitaesHTTPemJavapodeserfeitacomusodabibliotecacommonshttp
client.EstaAPIpermitequemontemosrequisiesHTTPerecebamossuasrespostas
correspondentes,damesmaformaqueocorreriacomumbrowsersimples.Noexisteacapacidadede
executarcdigojavascriptetambmnoexistemequivalentesparaospluginsdosbrowsers
completos.Mesmosemestesrecursos,ocommonshttpclientnosdopoderdefazerpraticamente
qualqueroperaopadroHTTPdoladocliente.Istotornaestabibliotecaumcomponentede
fundamentalimportnciaparaimplementaesRESTfulfeitasemJava.

ClientesAjax/JSON
Quandofalamosemwebservicesaprimeiraidiasobreoformatoparatrocadasinformaeso
XML.Porm,outrosformatosparatrocadedadosexistemepodematendermelhoraalgunscasos
particulares.
UmdestesformatosoJSON.Eletemsedifundidobastante,especialmentecomoumaalternativaao
XMLemAJAX,poisumformatonativamentesuportadoporqualquerinterpretadorjavascript.Outro
motivoqueumformatomaisenxuto,gerandodocumentosmenoresemaisfceisconsumir.Por
estasvantagens,temsidocomumousodeJSONparacriarclientesAJAXdeserviosREST.
Nalistagemabaixoapresentamosumexemplodefunojavascriptquebuscaitensdeumusurio
numservioRESTeapresentaosmesmosemumatabela.Mostramosapenasostrechosmais
relevantes.Oleitorpodeobterocdigocompletodosexemplosdeclientesajaxnositedarevista.A
listagemseguinteapresentaadefiniodeumafunoquefazumarequisioHTTPGETassncrona
aumservioREST.
<scripttype="text/javascript">
functionmostrarItens(){
//Fazachamadarest
varurl="/usuario/"+document.getElementById("cod_usuario").value+"/itens"
vartabela=document.getElementById("itens")
varresponse=RESTFul.get(url)
if(response.status!=200){
tabela.innerHTML="<b>Usurionoencontrado!</b>"
return
}
varitensUsuario=response.getObject()
varstringitens="<tableborder="1">"
stringitens+="<thead><td>codigo</td><td>descrio</td><td>nome</td><td>novo</td>"
+"<td>valorinicial</td><td>vendido</td></thead>"
for(iinitensUsuario.itensUsuario.item){
varitem=itensUsuario.itensUsuario.item[i]
stringitens+="<tr><td>
//requisioAjaxparaHTTPGET
get:function(url,request){

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

17/20

19/02/2015

WebServicesREST

//criaumXmlHttpRequest
xmlhttp=getXTR()
//constriumrequestdefault
if(!request){request=newRESTFul.Request()}
xmlhttp.open("GET",url,false)//requisioGETassncrona
xmlhttp.setRequestHeader("Accept","application/json")
xmlhttp.send(null)//requisiosemcorpo
while(xmlhttp.readyState!=4)
varresponse=
newRESTFul.Response(xmlhttp.status,xmlhttp.statusText,
xmlhttp.getAllResponseHeaders(),xmlhttp.responseText)
returnresponse
}

WebApplicationDescriptionLanguage(WADL)
HmuitadiscussoarespeitodeinterfacesdedescriodeserviosREST.Hquemjulguequeelas
nosonecessrias.OutrosachaminteressanteterumequivalentedoWSDLparaREST.
Consideramosqueconvenienteoferecerumainterfacesimplesdeconsultadosserviosdisponveis,
massemtantosdetalhescomooWSDL.UmadasopesdisponveisparaissooWADL.OWADL
informaquaissoasURIsdisponveis,osmtodospermitidosemcadaumadelas,eosparmetrosde
entradaesadadosservios.
OJerseygeraautomaticamenteumWADLdosnossosserviosapartirdenossasclassesRecurso.
Consideramosestedocumentobomosuficienteparanovalerapenageraralgosemelhantedeforma
customizada.MaisdetalhessobreosserviospodemsercolocadosnumaWikioupginasemelhante.
AgeraodoWADLumafuncionalidadeespecficadoJersey,enoestpresentenaJSR311.
ParaacessaroWADLcorrespondenteaosnossosrecursos,devemosfazerumasolicitaoHTTPGET
URI/application.wadl,naraizdanossaaplicao.Istoconvenienteporpermitirafcilvisualizao
comumbrowser.VejaodocumentoWADLdosserviosdoprocessodeleilo.

Suportedeferramentas
UmdospontospositivosdoswebservicesWS*quejexisteumamploconjuntodeferramentas
parafacilitarotrabalhocomestalinhadeservios.Geradoresdeclienteseesqueletosdeservio
estodisponveisparavriasplataformaselinguagens.
OswebservicesRESTtiveramqueesperarmuitomaistempoparateremasprimeirasferramentasde
desenvolvimento.Nodevemosverissocomoumpontonegativo.Seexistemmuitosprodutospara
melhorarotrabalhocomWS*porqueastecnologiasenvolvidasexigemisso.
OsserviosRESTsoessencialmentemaissimpleseconcentramseusdetalhesprincipaisemtorno
deHTTP.ComoastecnologiasutilizadascomRESTjsomuitomaduraseconhecidas,indiretamente
jhaviaumtimosuporteaestedesenvolvimento.
RecentementeoNetBeansintroduziupluginsfocadosemserviosREST,eestescontribuemcomum
ganhodeprodutividadenocomeododesenvolvimento.SomoscapazesdegerarclassesRecursoa
partirdeentidadesJPAetambmgerarclientesJavaeJavascriptparanossosservios.Estas
funcionalidadesajudamnarpidacriaodeprottipos,eoferecemumbompontodepartidana
implementao.DetalhessobreosuportedoNetBeansficamforadoescopodesteartigo,mas
recomendamosqueosleitoresavaliemosbenefciosqueesteIDEtraz.

Concluso
Oobjetivodesteartigofoipartirdeumexemploricoosuficientedearquiteturaorientadaaserviose
entofazeramodelagemedesenvolvimentodosmesmoscomusodeumaabordagemRESTful.
AtravsdoexemplodoleilodoMercadoLivre,fomoscapazesdepercorrertodasasetapas

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

18/20

19/02/2015

WebServicesREST

envolvidasnaimplementaodewebservicesREST.Entreestasetapaspodemosdestacara
identificaodosrecursos,mapeamentodeURIs,definiodoprotocolodecomunicaoeformasde
mapeamentodeJavaparaXMLeXMLparaJava.
FoipossvelilustrarbemcomoobomusodosrecursosdoHTTPpodemajudarnadefiniodeum
protocolodecomunicaoconcisoeclaro.ElementosjconhecidoscomoosstatusemtodosHTTP,
URIseContentTypespassamaserutilizadosparacomunicaesbemmaisdiversasdoquea
transfernciasimplesdeHTML.
ComoamadurecimentodasimplementaesREST,estamoscaminhandonadireodesolues
poderosaseinteroperveis.Atalgunsanosatrs,aadoodewebservicesrepresentavaumatroca
deperformanceporinteroperabilidade.Pioraraperformancenacomunicaocomamesma
plataformaelinguagemparasercapazdefalarcomqualqueroutroservio.
Istofelizmenteestdeixandodeserverdade.Estamosconquistandopodersuficienteparaterao
mesmotempoaltaperformanceeinteroperabilidade.
AJSR311eoJerseytrazembenefciosinteressantes,enonostiramopoderdoREST.Aintroduo
destescomponentessimplificaodesenvolvimento.Almdisso,ganhamosfuncionalidadesqueseriam
muitotrabalhosasdeimplementardeformacustomizada.Acapacidadedemanipularmltiplos
formatoseageraodoWADLsobonsexemplosdisso.
Esperamosqueesteartigotenhacontribudocomnovasidiasparaosleitoresnodesenvolvimentode
serviosREST.Estalinhadeserviosvemamadurecendoprogressivamenteejseapresentacomo
umaopopoderosaparaintegraoentreaplicaes.
Pretendopublicarvriosoutrosartigosnareadewebservices,integraoetecnologiasrelacionadas,
entosevocgostoudesteartigo,acompanhesempreasnovidadesporaqui

BrunoLuizPereiradaSilvaVisiteositedoautor:http://brunopereira.org/.

Engenheiroeletrnicoedecomputaode26anosquesefrustroucoma
eletrnicaeseapaixonouporsoftware.Trabalhacomsoftwaredesde2003(sem
contaroperodoacadmico)ecomJavadesdeocomeode2004.Seinteressabastantepor
diversasreasdistintas,comolinguagensdeprogramao,opensource,sistemasoperacionais,
processodedesenvolvimento,computaodistribuda,SOAeJavaemgeral.
Trabalhah2anosemeionaConcreteSolutions,atuandonaGlobo.com(maisprecisamente
nareadoISP)desdeminhachegadaempresa.AtualmentetambmcolunistadaJava
Magazine,comfocoprincipalemJavaEEeWebServicesemgeral.

49

11

32

Like

Leiatambm
ConhecendoainterfaceMapdoJava
Java

TrabalhandocomaInterfaceSetnoJava
Java

ClassesWrappersemJava
Java

ComboBoxModelemJava
Java

ReduzindoaMutabilidadeemJava
Java

Estamosaqui:

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

19/20

19/02/2015

WebServicesREST
Polticadeprivacidadeedeuso|Anuncie|Cadastrese|Faleconosco

LinhadeCdigofazpartedogrupoWeb03

LinhadeCdigo
Curtir

12.256pessoascurtiramLinhadeCdigo.

PluginsocialdoFacebook

2015LinhadeCdigo.Todososdireitosreservados

http://www.linhadecodigo.com.br/artigo/2059/webservicesrest.aspx

20/20