You are on page 1of 78

SERVICIOS REST

JERSEY JAX-RS

YO
{ nm :'iad Brlo, ae Rcro oil' cmay:'nvria JueI, opn Uiestt am ' mi :'oil@j.s, al brlouie' sca :{ oil titr:'brlo, wte @oil' bo :'m-tl.o' lg xluiscm, lnei :'ikdncmi/oil' ikdn lnei.o/nbrlo } }

YO

NDICE
Servicios web HTTP y REST Uso Jersey JAX-RS Testing El futuro de JAX-RS

SERVICIOS WEB

WIKIPEDIA:
"Un servicio web es una tecnologa que utiliza un conjunto de protocolos y estndares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programacin diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet."

DISTINTAS APROXIMACIONES:
SOAP. Formato XML e independiente del protocolo. Implementado en Metro (JAX-WS) "SOAP (Simple Object Access Protocol) es un protocolo estndar que define cmo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML"

DISTINTAS APROXIMACIONES:
REST. Cualquier formato sobre HTTP. Implementado en Jersey (JAX-RS) "Cualquier interfaz web simple sin las abstracciones adicionales de los protocolos basados en patrones de intercambio de mensajes"

LA GRAN VENTAJA DE REST

APROVECHA AL MXIMO LA INSFRASTRUCTURA DE HTTP


Simplicidad, escalabilidad, cacheo, seguridad, ...

REST != RPC
Evitar cosas como:
/eUuro gtsai /eAlsais gtlAuro /oiiaunayd mdfcCetBI

En su lugar utilizamos nombres que definen recursos:


/sais uuro /sais1 uuro/ /sais1fcua uuro//atrs

NO USAMOS SOAP PORQUE:


Complejo y dificil de mantener (WSDL) Necesidad de un framework tambin en el cliente Problemas de interoperabilidad Problemas para ser usado desde mviles o JavaScript No aprovecha al 100% HTTP Muchsimos estndares a conocer: ws-*

HTTP Y REST

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB


A travs de un navegador web: Consulta de pginas Envo de formularios Subir ficheros al servidor

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB


Desde lnea de comandos
cr -GTht:/w.ogee/ ul XE tp/wwgol.s

Desde algn lenguaje de programacin como Java


Dfuttplethtcin =nwDfuttplet) ealHtCin tplet e ealHtCin(; HtGthtGt=nwHtGt"tp/wwgol.s"; tpe tpe e tpe(ht:/w.ogee/) HtRsos rsos =htcin.xct(tpe) tpepne epne tpleteeuehtGt;

HTTP: ACCEDIENDO A CONTENIDOS EN LA WEB


O con el API cliente de Jersey JAX-RS:
Cin cin =Cin.rae) let let letcet(; Wbeorewbeore=cin.eore"tp/wwgol.s"; eRsuc eRsuc letrsuc(ht:/w.ogee/) CinRsos rsos =wbeoreacp(tx/tl)gtCinRsos.ls) letepne epne eRsuc.cet"ethm".e(letepnecas; i (epnegttts)= 20 { f rsos.eSau( = 0) Sse.u.rnl(epnegtniySrn.ls); ytmotpitnrsos.eEtt(tigcas) }

REST APROVECHA LA ARQUITECTURA DE LA WEB:

REST EST ORIENTADO A RECURSOS. ESTOS SON NOMBRES, NO VERBOS. ACCIONES:


GET: Recuperacin de un recurso POST: Creacin de un nuevo recurso PUT: Modificacin de un recurso o creacin si ya conocemos la clave DELETE: Eliminacin de un recurso HEAD: Envo slo de cabeceras. Muy utilizada para comprobar el Last-Modified.

EJEMPLOS:
Lista todos los coches o recupera uno
GT/as E cr GT/as13AW E cr/24A

Aade, modifica o elimina un coche


PS /as OT cr PT/as13AW U cr/24A DLT /as13AW EEE cr/24A

INDEPENDIENTE DEL FORMATO INTERCAMBIADO:

USO

Nos centramos en nuestro negocio: Buen diseo del software Exposicin de nuestro modelo como recursos Diseo modular Soporte de varios formatos y operaciones

DISEO DE UN API

INDEPENDENCIA DE LA CAPA CLIENTE:

JERSEY JAX-RS

QU ES?
Jersey es la implementacin Java de referencia del estndar JAX-RS para la definicin de servicios REST:
hts/jre.e.aant tp:/esydvjv.e/

QU ES? OBJETIVOS GENERALES:


Definir servicios en forma de POJOs Mapear peticiones y respuestas HTTP a esos POJOs Independencias del formato de transferencia Independiente del contenedor Parte de Java EE

QU ES?
Mapear peticiones HTTP a cdigo Java @GET / @POST / @PUT / @DELETE
@ah"sr" Pt(ues) pbi casUeseore ulc ls srRsuc { @E GT pbi Ls<sr gtsr( { ulc itUe> eUes) .. . } }

GT/sr E ues

QU ES?
Mapear parmetros de URL a parmetros de entrada a los mtodos @PathParam / @QueryParam
@E GT @ah"ues{srd" Pt(/sr/ueI}) pbi Ue gtsr ulc sr eUe( @ahaa(ueI" Srn ueI, PtPrm"srd) tig srd @urPrm"eu" @ealVle"" Srn dbg Qeyaa(dbg) Dfutau(5) tig eu) { }

GT/sr/41dbgS E ues12?eu=

QU ES?
Declaracin del formato de los contenidos recibidos o emitidos @Consumes / @Produces
@E GT @rdcsMdayeAPIAINXL Poue(eiTp.PLCTO_M) pbi Ls<sr gtsr( { ulc itUe> eUes) } @U PT @osmsMdayeAPIAINJO) Cnue(eiTp.PLCTO_SN pbi vi udtUe(srue){ ulc od paesrUe sr }

MAPEO DE LA PETICIN HTTP:

MAPEO DE LA RESPUESTA HTTP:

CDIGOS DE RESPUESTA HTTP:


1xx Informativos 2xx De xito (200 OK, 201 Created, 202 Accepted, 204 No Content) 3xx Redirecciones (301 Moved Permanently, 302 Found, 304 Not Modified 4xx Error en cliente (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed) 5xx Error en servidor (500 Internal Server Error, 501 Not Implemented, 502 Bad Gateway, 503 Service Unavailable)

GENERACIN DE DISTINTOS FORMATOS:


XML/JSON JAXB y Jackson ATOM Apache Abdera Personalizado MessageBodyReader y MessageBodyWriter

CONFIGURACIN DE UNA APLICACIN WEB JERSEY


Aadiendo las dependencias al proyecto descargndolas desde:
ht:/esydvjv.e/ tp/jre.e.aant

Ejemplo:
hts/gtu.o/oil/aaraso-ette/atreape/esysml tp:/ihbcmbrlojv-odhwrs/remse/xmlsjre-ipe

CONFIGURACIN DE UNA APLICACIN WEB JERSEY


Usando Maven:
<eedny dpnec> <ruI>o.u.esy/ruI> gopdcmsnjre<gopd <riatdjre-evr/riatd atfcI>esysre<atfcI> <eso>.4/eso> vrin11<vrin <dpnec> /eedny <eedny dpnec> <ruI>o.u.esy/ruI> gopdcmsnjre<gopd <riatdjre-eve<atfcI> atfcI>esysrlt/riatd <eso>.4/eso> vrin11<vrin <dpney /eedc>

Ejemplo:
hts/gtu.o/oil/aaraso-ette/atreape/esymvn tp:/ihbcmbrlojv-odhwrs/remse/xmlsjre-ae

CONFIGURACIN DE UNA APLICACIN WEB JERSEY


Definicin del web.xml:
<e-p> wbap <eve> srlt <eve-aejxssrlt/eve-ae srltnm>ar-eve<srltnm> <eve-ls> srltcas cmsnjre.p.otie.eve.eveCnanr o.u.esysicnanrsrltSrltotie <srltcas /eve-ls> <ntprm ii-aa> <aa-aecmsnjre.ofgpoet.akgs/aa-ae prmnm>o.u.esycni.rprypcae<prmnm> <aa-au>o.ehra.etsrie<prmvle prmvlecmdcalsts.evcs/aa-au> <ii-aa> /ntprm <odo-tru><la-nsatp la-nsatp1/odo-tru> <srlt /eve> <eve-apn> srltmpig <eve-aejxssrlt/eve-ae srltnm>ar-eve<srltnm> <r-atr>rs/<ulpten ulpten/et*/r-atr> <srltmpig /eve-apn> <wbap /e-p>

CONFIGURACIN DE UNA APLICACIN WEB JERSEY


Si usamos Servlet 3.0:
@plctoPt(rs" Apiainah"et) pbi casMApiainetnsPcaeRsucCni { ulc ls yplcto xed akgseoreofg pbi MApiain){ ulc yplcto( spr"o.ehra.etsrie"; ue(cmdcalsts.evcs) } }

EJEMPLO BSICO:
pcaecmdcalsts.evcs akg o.ehra.etsrie; @ah"sr" Pt(ues) pbi casUeRsuc { ulc ls sreore @E GT pbi Srn syel( { ulc tig aHlo) rtr "el wrd!" eun Hlo ol!!; } }

Acceso desde el navegador o lnea de comandos:


GT-GTht:/oahs:00ues E XE tp/lclot88/sr

INICIO DE LA APLICACIN:
Eclipse "Run on server" o j t y r nen Maven: et:u
2-c-022:43 cmsnjre.p.oePcaeRsucCni ii 7ot21 00:1 o.u.esyaicr.akgseoreofg nt IF:Sann frro rsuc adpoie cassi tepcae: NO cnig o ot eore n rvdr lse n h akgs cmfsexljcsnjxsjo o.atrm.ako.ar.sn cmdcalssrie o.ehra.evcs 2-c-022:43 cmsnjre.p.oeSannRsucCni lglse 7ot21 00:1 o.u.esyaicr.cnigeoreofg oCass IF:Ro rsuc cassfud NO ot eore lse on: cascmdcalssrie.sreore ls o.ehra.evcsUeRsuc 2-c-022:43 cmsnjre.p.oeSannRsucCni lglse 7ot21 00:1 o.u.esyaicr.cnigeoreofg oCass IF:Poie cassfud NO rvdr lse on: cascmfsexljcsnjxsjo.akoJxJoPoie ls o.atrm.ako.ar.snJcsnabsnrvdr cascmfsexljcsnjxsjo.snasEcpinapr ls o.atrm.ako.ar.snJoPrexetoMpe cascmfsexljcsnjxsjo.snapnEcpinapr ls o.atrm.ako.ar.snJoMpigxetoMpe cascmfsexljcsnjxsjo.akoJoPoie ls o.atrm.ako.ar.snJcsnsnrvdr IF:Iiitn Jre apiain vrin'esy 11 0/921 0:4P' NO ntaig esy plcto, eso Jre: .4 62/02 51 M

EJEMPLO JSON:
Partimos de los datos datos en forma de Java Bean:
@mRoEeet Xlotlmn pbi casUe { ulc ls sr piaeLn i; rvt og d piaeSrn nm; rvt tig ae }

El servicio REST los serializa con JAXB o Jackson

Tambin funciona para JSON Natural JSON con Jackson

JSON serializado por JAXB:


{ "sr:[ ue" { "d:"" i" 1, "ae:"er PrzPro nm" Pdo ee ad" } ] }

JSON serializado por Jackson:


[ { "d:1 i" , "ae:"er PrzPro nm" Pdo ee ad" } ]

CONFIGURACIN EXTRA DEL WEB.XML


<eve> srlt <eve-aejxssrlt/eve-ae srltnm>ar-eve<srltnm> <eve-ls>o.u.esysicnanrsrltSrltotie<srltcas srltcascmsnjre.p.otie.eve.eveCnanr/eve-ls> <ntprm ii-aa> <aa-aecmsnjre.ofgpoet.akgs/aa-ae prmnm>o.u.esycni.rprypcae<prmnm> <aa-au>o.atrm.ako.ar.sn ../aa-au> prmvlecmfsexljcsnjxsjo; .<prmvle <ii-aa> /ntprm .. . <srlt /eve>

USO DE JACKSON

EJEMPLO JSON Y XML:


@ah"sr" Pt(ues) pbi casUeRsuc { ulc ls sreore @E GT @rdcs{"plcto/sn,"etxl } Poue( apiainjo" tx/m" ) pbi Ue gtsr){ ulc sr eUe( rtr nwUe(,"sai 1) eun e sr1 Uuro "; } }

GT-GT- "cet apiainjo"ht:/oahs:00ues E XE H Acp: plcto/sn tp/lclot88/sr GT-GT- "cet tx/m"ht:/oahs:00ues E XE H Acp: etxl tp/lclot88/sr

CLIENTE DE ACCESO AL SERVICIO JSON:


@ah"sr" Pt(ues) pbi casUeRsuc { ulc ls sreore @E GT @ah"i}) Pt({d" @rdcs{"plcto/sn,"etxl } Poue( apiainjo" tx/m" ) pbi Ue gtsr@ahaa(i" Srn i){ ulc sr eUe(PtPrm"d) tig d rtr nwUe(d "sai 1) eun e sri, Uuro "; } }

Cin cin =Cin.rae) let let letcet(; Wbeorersuc =cin.eore"tp/lclot88/esymvnrs"; eRsuc eore letrsuc(ht:/oahs:00jre-ae/et) CinRsos rsos =rsuc.ah"ues1)gtCinRsos.ls) letepne epne eorept(/sr/".e(letepnecas; Ue ue =rsos.eEtt(srcas sr sr epnegtniyUe.ls)

BSQUEDA EN TWITTER:
Recuperacin del resultado como un JSONObject:
Cin cin =Cin.rae) let let letcet(; cin.dFle(e Lgigitr); letaditrnw ognFle() Wbeorersuc =cin.eore"tp/sac.wte.o/) eRsuc eore letrsuc(ht:/erhtitrcm"; CinRsos rsos =rsuc.ah"erhjo" letepne epne eorept(sac.sn) .urPrm"" "rceraso".e(letepnecas; qeyaa(q, oal+odhw)gtCinRsos.ls) JOOjc dt =rsos.eEtt(SNbetcas; SNbet aa epnegtniyJOOjc.ls) Asr.setqasSau.Kgtttsoe) rsos.eSau() setasrEul(ttsO.eSauCd(, epnegttts); Asr.setqas1 dt.eIt"ae); setasrEul(, aagtn(pg")

GESTIN DE ERRORES
Uso del intefaz ExceptionMapper para interceptar excepciones:
@rvdr Poie pbi casCmoEcpinapripeet EcpinaprEcpin { ulc ls omnxetoMpe mlmns xetoMpe<xeto> @vrie Oerd pbi Rsos tRsos(xeto ecpin { ulc epne oepneEcpin xeto) lgerr"ade b Ecpinapr,ecpin; o.ro(Hnld y xetoMpe" xeto) rtr Rsos.evrro(.yeMdayeTX_LI) eun epnesreErr)tp(eiTp.ETPAN .niyecpingtesg()bid) ett(xeto.eMsae).ul(; } }

Los @Provider permiten interactuar con el ciclo peticin/respuesta

OTRAS FUNCIONALIDADES DISPONIBLES:


Hypermedia Seguridad: OAuth, SSL, etc Logging Gestin de excepciones Soporte para Spring Framework API de acceso cliente Uploads: Jersey Multipart Testing: Jersey Test Framework Y mucho ms ...

TESTING

DEFINICIN
"Unit testing is a software verification and validation method in which a programmer tests if individual units of source code are fit for use. A unit is the smallest testable part of an application"

BENEFICIOS:
Facilitar el cambio y el refactoring Diseo simple y modular del cdigo Sirve como documentacin Ahorra mucho tiempo y costes con futuros bugs

HERRAMIENTAS
Pruebas de cdigo: jUnit Pruebas de interfaz: Selenium Pruebas de integracin: SoapUI o Jersey Test Framework Pruebas de estrs: jMeter con independencia del lenguaje en el que est desarrollado el servicio

DEPENDENCIAS EXTRA NECESARIAS


Aadir al pom.xml las siguientes dependencias:
<eedny dpnec> <ruI>o.u.esyjre-etfaeok/ruI> gopdcmsnjre.esyts-rmwr<gopd <riatdjre-etfaeokcr<atfcI> atfcI>esyts-rmwr-oe/riatd <eso>.4/eso> vrin11<vrin <dpnec> /eedny <eedny dpnec> <ruI>o.u.esyjre-etfaeok/ruI> gopdcmsnjre.esyts-rmwr<gopd <riatdjre-etfaeokgizy/riatd atfcI>esyts-rmwr-rzl<atfcI> <eso>.4/eso> vrin11<vrin <dpnec> /eedny

DEFINICIN DE UN TEST
Cdigo necesario para arrancar el contenedor Java:
pbi casUeseoreetetnsJreTs { ulc ls srRsucTs xed esyet piaeWbeorersuc; rvt eRsuc eore pbi Ueseoreet){ ulc srRsucTs( sprnwWbpDsrpo.ule(cmdcalssrie" ue(e eApecitrBidr"o.ehra.evcs) .otxPrm"eApote" "esymvnro" cnetaa(wbpRoKy, jre-ae.ot) .eveCasSrltotie.ls)bid); srltls(eveCnanrcas.ul() ti.eore=rsuc(; hsrsuc eore) } @vrie Oerd poetdTsCnanratr gtetotieFcoy){ rtce etotieFcoy eTsCnanratr( rtr nwGizyeTsCnanratr(; eun e rzlWbetotieFcoy) } }

DEFINICIN DE UN TEST
Definicin de los tests:
pbi casUeseoreetetnsJreTs { ulc ls srRsucTs xed esyet / Mtdsd dfnc d l sieatro / oo e eiiin e a ld neir @et Ts pbi vi dltUe( trw Ecpin{ ulc od eeesr) hos xeto CinRsos rsos =rsuc.ah"sr/" letepne epne eorept(ues1) .cet"plainjo" acp(apito/sn) .eeeCinRsos.ls) dlt(letepnecas; Asr.setqasSau.OCNETgtttsoe) setasrEul(ttsN_OTN.eSauCd(, rsos.eSau() epnegttts); } }

EL FUTURO DE JAX-RS

JAX-RS 2.0

El futuro es ...

PREGUNTAS?

You might also like