Resum
Els serveis web són una peça clau en el desenvolupament d’arquitectures de programari orientades a serveis i, més recentment, per a la creació d’arquitectures basades en microserveis.
Un servei web és una tecnologia que fa servir un conjunt de protocols i estàndards per tal d’intercanviar dades entre aplicacions. La característica principal dels serveis web és que permeten la interoperativitat entre aplicacions que poden estar desenvolupades en diferents llenguatges i executar-se en plataformes diferents.
Hi ha dos tipus de serveis web:
- Serveis web SOAP
- Serveis web RESTful
Els serveis web SOAP es basen en el protocol SOAP, que permet la interacció de serveis web basats en XML. L’especificació de SOAP inclou la sintaxi amb la qual s’han de definir els missatges, les regles de codificació dels tipus de dades i les regles de codificació que regiran les comunicacions entre aquests serveis web.
El proveïdor del servei web SOAP el dissenya, l’implementa i publica la seva interfície i el format dels missatges en un document de definició del servei web anomenat WSDL. El document WSDL de definició d’un servei web descriu on es localitza, quines operacions proporciona, el format dels missatges que han de ser intercanviats i com cal cridar el servei. Els clients del servei web n’han de tenir prou amb aquesta descripció per poder comunicar-se i intercanviar-hi informació.
L’especificació de Java EE 7 inclou diverses especificacions que donen complet suport a la creació i el consum de serveis web SOAP; la més destacada és JAX-WS, que utilitza missatges XML seguint el protocol SOAP i oculta la complexitat d’aquest protocol proporcionant una API senzilla per al desenvolupament, el desplegament i el consum de serveis web SOAP amb Java EE.
Els serveis web SOAP amb Java EE 7 es poden implementar de dues maneres: amb una classe Java normal que s’executa en un contenidor de servlets o bé com un EJB de sessió sense estat o singleton que s’executa en un contenidor d’EJB. Per crear un servei web SOAP amb Java EE 7 implementat mitjançant una classe Java normal tan sols cal que creeu la classe, l’anoteu amb l’anotació @WebService
i anoteu tots els mètodes que vulgueu proporcionar amb l’anotació @WebMethod
. La definició d’una interfície que implementarà aquesta classe és opcional.
Un cop creat el servei web cal que el desplegueu per tal de fer-lo accessible als clients. El procés de desplegament del servei web engega un conjunt de processos definits a JAX-WS per tal de generar el document WSDL de descripció del servei i publicar els endpoints del servei web.
Per cridar serveis web des de Java amb l’API JAX-WS mitjançant stubs estàtics cal que codifiqueu la classe que farà de client, genereu els artefactes necessaris per poder consumir el servei web des d’aquest client amb la utilitat Wsimport i compileu i executeu el client.
El procediment per cridar serveis web SOAP des d’una aplicació web és el mateix que des d’una aplicació Java: cal que feu servir l’API JAX-WS per codificar el component que farà de client, genereu els artefactes necessaris per poder consumir el servei web amb la utilitat Wsimport i compileu i desplegueu l’aplicació web.
Els serveis web RESTful es basen en un conjunt de regles i principis que permeten desenvolupar serveis web fent servir HTTP com a protocol de comunicacions entre el client i el servei web, i es fonamenten a definir accions sobre recursos mitjançant l’ús dels mètodes GET
, POST
, PUT
i DELETE
inherents d’HTTP.
REST es basa en l’ús d’estàndards oberts en totes les seves parts; així, fa servir URI per a la localització de recursos, HTTP com a protocol de transport, els verbs HTTP per especificar les accions sobre els recursos i els tipus MIME per a la representació dels recursos (XML, JSON, XHTML, HTML, PDF, GIF, JPG, PNG, etc.).
Qualsevol cosa que es pugui identificar amb una URI es considera un recurs i, per tant, es pot manipular mitjançant accions (també anomenades verbs) especificades a la capçalera HTTP de les peticions seguint el següent conjunt de regles i principis que regeixen REST:
POST
: crea un recurs nou.GET
: consulta el recurs i obté la seva representació.DELETE
: esborra un recurs.PUT
: modifica un recurs.HEAD
: obté metainformació del recurs.
L’especificació de Java EE 7 inclou JAX-RS com a l’API per crear serveis web basats en REST. De fet, per escriure un servei web RESTful tan sols cal un client i un servidor que es puguin comunicar per HTTP, però caldria fer a mà tota la configuració i l’anàlisi de les peticions i les respostes. JAX-RS us estalviarà aquesta feina, ja que amb un petit conjunt d’anotacions permet desenvolupar còmodament serveis web RESTful.
JAX-RS permet publicar serveis web RESTful que implementen les operacions CRUD sobre un recurs de forma molt fàcil i molt àgil.
Entre les anotacions més importants que proporciona JAX-RS tenim @Path
, que indica la URI amb la qual farem accessible el recurs; @Produces
, que permet indicar quin és el tipus MIME de resposta; @Consumes
, que permet especificar quins són els tipus MIME que admet la petició, i @PathParam
, @QueryParam, @MatrixParam
, @CookieParam
, @HeaderParam
i @FormParam
, que permeten recollir informació de diferents parts de la petició i construir els objectes adients per passar-los als mètodes que ofereix cada funcionalitat.
Un dels formats que suporta JAX-RS i que està esdevenint molt popular per la simplicitat, la lleugeresa i la facilitat de lectura és JSON. Aquest format és especialment adient per a aplicacions mòbils en què la quantitat d’informació que s’intercanvien client i servidor per fer les operacions és primordial.
Per provar un servei web RESTful tan sols cal que fem les peticions HTTP adients per a cada operació definida. cURL és una utilitat de línia de comandes que us pot ajudar a fer les proves.
Tot i que es poden provar els serveis RESTful amb qualsevol eina que permeti fer peticions HTTP, JAX-RS 2.0 proporciona una API client estàndard que permet fer tota mena de peticions HTTP als serveis web RESTful remots de forma fàcil. La utilitzarem tant des de clients Java stand-alone com des dels tests d’integració que ens permetran provar els serveis web.
Els serveis web RESTful es poden programar per tal que responguin a les peticions de forma asíncrona afavorint en alguns casos el throughput i l’escalabilitat a nivell de servidor.
Els serveis web RESTful es poden invocar síncronament o asíncronament. La invocació asíncrona permet evitar bloquejos al client en operacions que triguin molt de temps.