Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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