Dalla prima specifica di HTML resa pubblica da Tim Berners-Lee nel 1991, molta strada è stata fatta dagli sviluppatori web nel corso di questi ultimi 30 anni. In particolare, soprattutto nell’ultimo decennio, abbiamo visto crescere nuovi web framework basati su javascript: AngularJS, React, Vue, ecc. Con l’arrivo di queste nuove tecnologie tuttavia gli sviluppatori si sono spesso trovati anche a implementare logica di backend in javascript, utilizzando così nuovi runtime environment, come NodeJS, per fornire funzionalità di backend alle proprie applicazioni, portando javascript ad essere il linguaggio maggiormente adottato dagli  sviluppatori a livello globale.

L’adozione di javascript in questo contesto tuttavia viene spesso rimpiazzata da Java in alcuni casi, come ad esempio nelle enterprise application, ovvero quelle applicazioni che modellano interi processi di business di una azienda. Non è un caso che ancora oggi grandi aziende come Google, Amazon e settori come quello finanziario, rimangano legati a soluzioni backend Java, almeno per i seguenti motivi:

Ecosistema: fondamenta del linguaggio estremamente solide e disponibilità di un grande numero di librerie, framework e tool di sviluppo consolidati. Le tecnologie non evolvono così rapidamente come nel contesto javascript, causando minore confusione.

Portabilità: Applicazioni Java possono essere portate a qualsiasi sistema supporti l’esecuzione della Java Virtual Machine.

Strong-typing: linguaggio fortemente tipato offre ulteriori check allo sviluppatore a tempo di compilazione.

Se tuttavia Java implica una maggiore complessità rispetto all’utilizzo di linguaggi di script, sviluppare un servizio REST in Java è diventato oggi molto semplice, soprattutto grazie alla disponibilità di framework come Spring.

In questo articolo vedremo come creare un semplice servizio REST con Spring Boot per fornire semplicemente dei dati. 

In particolare il nostro servizio offrirà un metodo per recuperare una semplice lista di utenti.

Prerequisiti:

  • Conoscenza Java di base
  • JDK 11 o seguenti
  • IDE di sviluppo installato sul sistema, in questa guida si considera IntelliJ IDEA

La prima cosa cosa da fare in ogni progetto Spring, è fare visita al sito Spring Initialzr per scaricare un template di progetto pronto all’uso.

Selezioniamo “Project: Maven” per la gestione del progetto, Java come linguaggio e l’ultima versione stabile di Spring Boot. 

Dalla lista delle dipendenze selezioniamo “Add Dependencies” e aggiungiamo “Spring Web”. 

Confermiamo le scelte cliccando su “Generate”, questo scaricherà uno zip col template di progetto.

Estraiamo il contenuto dello zip in una cartella e apriamo questa cartella nel nostro IDE 

(File -> Open -> seleziona directory e conferma).

A questo punto IntelliJ leggerà il contenuto del progetto di partenza che abbiamo scaricato, analizzerà il pom.xml e scaricherà le dipendenze dichiarate.

Questo è un progetto spring boot, un framework che permette di creare con il minimo sforzo nuovi progetti Java favorendo un approccio “convention over configuration”, quindi prendendo delle decisioni di partenza rispetto a vari aspetti che riguardano l’applicazione, permettendo allo sviluppatore di modificarli in seguito, se necessario.

Spring Boot offre inoltre strumenti per il testing dell’applicazione, evitando lo sviluppatore, ad esempio, di dover preparare un container web (es: tomcat) per l’esecuzione della propria app.

All’interno del pom.xml vedremo questi elementi di rilievo:

  • Parent project: Il parent pom permette di ereditare dal pom spring-boot-starter-parent di riferimento varie configurazioni tra le quali la più importante è il BOM (Bill of Material), ovvero una lista di numeri di versioni per le dipendenze da usare con ogni versione di spring boot. In questo modo lo sviluppatore non dovrà dichiarare i numeri di versione per le dipendenze spring, in quanto il BOM importato dal parent, fornirà già questi numeri di versione garantendo la compatibilità tra le varie dipendenze. In questo caso utilizzeremo le dipendenze derivanti dalla versione spring boot 2.4.4.
  • Dipendenze
    •     spring-boot-starter-test: libreria che include strumenti per il testing di applicazioni spring boot
    •     spring-boot-start-web: libreria che include varie dipendenze utili nello sviluppo di applicazioni web
  • Plugin
    • spring-boot-maven-plugin: plugin maven che offre varie funzionalità per testare e compilare l’applicazione spring boot
Copy to Clipboard

Iniziamo creando una nuova class nel package com.example.demo, il quale conterrà la rappresentazione del dato che vogliamo fornire tramite il metodo REST, ovvero l’utente.

Copy to Clipboard

In questo caso abbiamo deciso di modellare l’utente con una sola proprietà, il nome.Secondo l’approccio Spring per la costruzione di servizi REST , le richieste HTTP sono gestite da un controller (dal paradigma Model-View-Controller).

Lo sviluppatore può creare vari controller per offrire funzionalità nelle varie sezioni tematiche della propria business logic. Creiamo quindi un controller con un metodo per tornare una lista di utenti.

Copy to Clipboard

Questa classe rappresenta il controller, ed è caratterizzata dalla annotazione @RestController. La presenza di questa annotazione permette a Spring di riconoscere la classe come controller e di servire particolari richieste HTTP tramite questo componente.

Un metodo pubblico getUsers definisce la lista di utenti. In questo esempio gli utenti sono dichiarati nel codice, in uno scenario realistico questi saranno recuperati da un database.

Il metodo è annotato con @GetMapping(“/users”). Questa annotazione configura il metodo per rispondere a una chiamata HTTP di tipo GET alla URL “/users”. Esistono naturalmente altre annotazioni per altri tipi di chiamate REST (@PostMapping per POST, ecc.) o la generica annotazione @RequestMapping.

Fatto questo possiamo lanciare la nostra applicazione tramite linea di comando con maven utilizzando una feature del plugin spring boot visto sopra.

Dalla directory del progetto lanciamo il comando: `mvn spring-boot:run`

Copy to Clipboard

Dal log vediamo che il comando ha predisposto un container Tomcat embedded, in ascolto sulla porta 8080, e reso disponibile l’applicazione sul context root path.

Possiamo quindi aprire un browser e testare l’applicazione tramite l’indirizzo http://localhost:8080/users, recuperando questo documento:

Copy to Clipboard

Questo documento non è altro che la rappresentazione JSON dei dati dichiarati nel controller. L’utilizzo di JSON come formato per la serializzazione dei dati riflette l’approccio “Convention over configuration”. Questa scelta infatti è una delle scelte di default incluse in spring boot. Lo sviluppatore può decidere di modificare questi aspetti liberamente in seguito.

Luigi Fortunati

Senior Software Engineer @ Wondersys