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.

JAX-WS és l’API estàndard que defineix Java EE per desenvolupar i desplegar serveis web SOAP, mentre que Spring-WS és el projecte que ofereix Spring per desenvolupar i desplegar serveis web SOAP. Spring-WS es basa completament en Spring i porta inherent al seu model molts dels conceptes clau a Spring, com poden ser la injecció de dependències.

Hi ha dues estratègies per desenvolupar serveis web SOAP en Java:

  • Code First
  • Contract First

L’estratègia Code First implica primer implementar les classes Java del servei i, a partir d’aquestes, generar el document WSDL de descripció del servei.

L’estratègia Contract First implica fer primer la definició del servei abans d’implementar-lo. Això vol dir descriure els paràmetres i tipus de retorn del servei amb XSD (de l’anglès XML Schema Definitions); després utilitzar aquest XSD per generar el document WSDL, que serà el contracte públic del servei, i finalment generar les classes Java que implementaran el servei d’acord amb aquest contracte.

Spring-WS tan sols suporta la creació de serveis web SOAP seguint l’estratègia Contract First, mentre que amb JAX-WS es poden crear serveis web SOAP tant seguint una estratègia com l’altra.

L’elecció entre JAX-WS i Spring-WS a l’hora de desenvolupar serveis web SOAP amb Java no és senzilla, i no hi ha cap de les dues tecnologies que sigui una clara guanyadora, atès que totes dues aproximacions tenen els seus punts forts i els seus punts febles.

El primer que cal fer per desenvolupar un servei web SOAP amb Spring-WS és crear el document XSD que definirà el model de domini i el format de les peticions i les respostes. El model de domini es defineix amb un fitxer d’esquema XML que després Spring-WS s’encarregarà d’exportar a WSDL.

A partir del document XSD de definició del servei, Spring-WS genera automàticament les classes Java que formaran tant el model del domini com les peticions i les respostes del servei web. Normalment, això es farà automàticament en temps de construcció.

Un cop generades les classes Java que modelen el domini i les peticions i respostes s’implementa el servei i després es crea l’endpoint que enllaçarà les peticions SOAP amb el servei que farà la feina. Spring proporciona la infraestructura necessària per recollir les peticions SOAP que vagin al servei i les envia a l’endpoint per tal de processar-les i tornar la resposta als clients.

L’endpoint utilitza un conjunt d’anotacions específiques per enllaçar-lo amb la definició del servei; cal anotar la classe amb @Endpoint, els mètodes amb @PayloadRoot i @ResponsePayload i els paràmetres dels mètodes, amb @RequestPayload.

Els serveis web SOAP desenvolupats amb Spring-WS es poden provar amb cURL enviant peticions POST a l’URL configurat amb el missatge SOAP de la petició.

Spring-WS permet codificar clients Java que consumeixin qualsevol tipus de servei web SOAP estigui o no codificat amb Spring-WS; només cal la definició WSDL del servei.

Per crear un client Java amb Spring-WS cal que genereu els artefactes necessaris per poder consumir el servei web a partir de la seva definició en format WSDL, codifiqueu la classe Java que farà la crida al servei web heretant de la classe WebServiceGatewaySupport que proporciona Spring-WS i compileu i executeu aquest client.

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 fonamenta 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.

Spring MVC és el mòdul del projecte Spring que proporciona suport per crear i consumir serveis web basats en REST. Spring no proporciona un projecte ni un mòdul específic per a la creació i el consum de serveis web RESTful, sinó que ho engloba com una capacitat més dins el projecte Spring MVC.

Spring MVC permet publicar serveis web RESTful que implementen les operacions CRUD sobre un recurs de forma molt fàcil i molt àgil.

Mentre que JAX-RS és una API centrada únicament i exclusivament en el desenvolupament de serveis web RESTful, Spring MVC és un mòdul del projecte Spring centrat en el desenvolupament web en general, i és en aquest marc que dóna complet suport tant al desenvolupament d’aplicacions web com al desenvolupament de serveis web RESTful.

Entre les anotacions més importants que proporciona Spring tenim @RestController per marcar la classe com un controlador REST on cada un dels seus mètodes tornarà un objecte del domini enlloc d’una vista. Aquesta és la diferencia més gran entre un controlador MVC típic i un controlador per serveis web RESTful: el cos de la resposta HTTP es crea transformant un objecte del domini a JSON i no es torna en format HTML. La resta d’anotacions són les mateixes que tenim quan treballem amb un projecte web Spring MVC.

Un dels formats que suporta Spring i que està esdevenint molt popular per la simplicitat, lleugeresa i 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. Spring fa servir la llibreria Jackson per fer les transformacions entre el format JSON i la seva representació Java, i a l’inrevés.

Spring MVC permet crear un conjunt de tests que van a cavall entre un test unitari i un test d’integració. Aquests tests us permetran provar els serveis web sense necessitat de tenir-los desplegats i executant-se a un servidor d’aplicacions. Els tests unitaris proporcionats per Spring MVC es basen en JUnit 4.

De forma molt simplificada, podríem veure HATEOAS (de l’anglès Hypermedia as the Engine of Application State) com un principi de disseny que obliga al fet que, donat un punt d’entrada al servei, els clients han de ser capaços de descobrir tots els seus recursos basant-se únicament en respostes donades pel servidor. Molts puristes diuen que una API no és realment RESTful si no segueix aquest principi de disseny.

Spring proporciona la classe RestTemplate per simplificar la comunicació HTTP entre el client i el servidor. RestTemplate permet fer tota mena de peticions HTTP des d’aplicacions Java als serveis web RESTful remots de forma fàcil, i és molt útil a l’hora d’escriure tests d’integració per provar serveis web RESTful.

AJAX és una de les formes més utilitzades a l’hora de consumir serveis web RESTful des de pàgines o aplicacions web. Actualment hi ha multitud de bastiments JavaScript que proporcionen, entre moltes altres coses, la possibilitat de fer peticions AJAX, entre els quals cal destacar jQuery i Angular JS.

CORS és una tecnologia que cada vegada necessitem més a l’hora de desenvolupar aplicacions web i també aplicacions mòbils. En una aplicació clàssica podem carregar una pàgina web i sol·licitar dades dinàmiques al servidor mitjançant AJAX, però aquestes dades dinàmiques han de pertànyer al mateix domini. Si les dades no pertanyen al mateix domini, l’aplicació no les podrà carregar per limitacions de seguretat.

Spring proporciona l’anotació @CrossOrigin per habilitar les capçaleres CORS a la resposta enviada pels serveis web i així permetre les peticions Cross-Origin.

Anar a la pàgina següent:
Resultats d'aprenentatge