La maggior parte delle applicazioni che utilizziamo oggi seguono l'architettura client-server. L'applicazione stessa è considerata il client o front-end e comunica con un server o il back-end per la gestione del flusso dati. Questa comunicazione viene stabilita con l'aiuto del protocollo HTTP. È qui che entrano in gioco le API REST. Vedi Creare un servizio API REST di alta qualità.
In questo articolo ti guiderò su come creare un servizio API REST con Spring Boot in Java. Spring Boot è uno strumento open source basato su Java utilizzato per creare facilmente applicazioni Web e microservizi.
Per maggiori dettagli ti consiglio di leggere l’articolo Spring vs Spring Boot: conosciamo le differenze.
Per creare un servizio API REST Spring Boot con Java, devi disporre di:
- IDE (Eclipse, IntelliJ oppure Editor di testo)
- JDK 1.8+
- Maven 3.0+
Il primo passaggio da fare è quello di creare un progetto Spring Boot vuoto. Per semplicità utilizzeremo lo strumento messo a disposizione che si chiama Spring Initializr.
Dal tuo browser web, vai su start.spring.io. Scegli Maven come strumento di compilazione, Java come linguaggio e la versione di Spring Boot che vuoi utilizzare.
Successivamente dobbiamo aggiungere alcune dipendenze da utilizzare in questo progetto.
- Spring Data JPA – API Java Persistence e Hibernate.
- Spring Web – per includere Spring MVC e incorporare Tomcat nel tuo progetto.
- Spring Boot DevTools – Strumenti di sviluppo.
- MariaDB Driver – Driver JDBC (qualsiasi DB che si desidera utilizzare).
Una volta terminata la configurazione, fare clic su "Genera". Verrà quindi scaricato un file ZIP. Una volta terminato il download, ora puoi importare i tuoi file di progetto come un progetto Maven nel tuo IDE o un editor di testo.
Successivamente, devi configurare il database e puoi farlo facilmente con Spring Data JPA. Aggiungi alcune informazioni nel file /src/main/resources/application.properties per impostare la connessione al database. Aggiungi l'URL di connessione JDBC, fornisci nome utente e password per l'autenticazione e imposta la proprietà ddl-auto come aggiornamento.
Hibernate ha dialetti diversi per database diversi e di default Hibernate lo imposta automaticamente, ma è buona norma specificarlo in modo esplicito.
## Database Properties
spring.datasource.url = jdbc:mariadb://localhost:3306/tutorialdb?useSSL=false
spring.datasource.username = user
spring.datasource.password = password
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database maria db 10.0 10.1
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MariaDB10Dialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
In questo step procediamo a creare il modello di dominio. Sono anche chiamati Entità e vengono definiti dall’annotazione @Entity.
Nel nostro caso creiamo una semplice entità Libro annotando la classe con @Entity. Usa l'annotazione @Table per specificare il nome della tua tabella associata.
L'annotazione @Id viene utilizzata per annotare un campo chiave unico come ID di un'entità. Inoltre, lo impostiamo come @GeneratedValue e GenerationType su SEQUENCE per gestire automaticamente la generazione di un’id sequenziale ad ogni inserimento.
@Entity
@Table(name = "libri")
public class Libro {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private String nome;
private String autore;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getAutore() {
return autore;
}
public void setAutore(String autore) {
this.autore = autore;
}
}
Per eseguire operazioni CRUD sulle entità Libro, bisogna disporre di un Repository, nel nostro caso lo chiameremo LibriRepository. Per fare ciò, dovrai estendere JpaRepository e annotare l'interfaccia con @Repository.
@Repository
public interface LibroRepository extends JpaRepository<Libro, Long> {}
Arrivati a questo punto andrai ad implementare la vera business logic per la gestione delle informazioni. Quindi crea una classe LibroController come mostrato di seguito:
@RestController
@RequestMapping("/api/libro")
public class LibroController {
@Autowired
private LibroRepository libroRepository;
@GetMapping
public List findAllBooks() {
return libroRepository.findAll();
}
@GetMapping("/{id}")
public ResponseEntity findBookById(@PathVariable(value = "id") long id) {
Optional libro = libroRepository.findById(id);
if(libro.isPresent()) {
return ResponseEntity.ok().body(libro.get());
} else {
return ResponseEntity.notFound().build();
}
}
@PostMapping
public Libro saveBook(@Validated @RequestBody Libro libro) {
return libroRepository.save(libro);
}
}
Prima di tutto devi annotare la tua Repository, LibroRepository, con l’annotazione @Autowired per l'iniezione delle dipendenze. Per specificare il tipo di richieste HTTP accettate, utilizzare le annotazioni @GetMapping e @PostMapping.
Quindi, riassumendo, la nostra classe controller espone tre end-point dove il primo, findAllBooks(), ci permette di reperire l’elenco dei libri già presenti. Dopo troviamo il metodo findBookById(@PathVariable(value = "id"), che ci permette, passando un id come parametro, di ricevere i dati del libro trovato se presente. In fine abbiamo il metodo saveBook(@Validated @RequestBody Libro libro) che ci permette di salvare un record su db passando i dati di un libro.
Inoltre bisogna ricordare che l'annotazione @Validated viene utilizzata per imporre la validità di base per i dati forniti, in questo caso del libro. L'annotazione @RequestBody viene utilizzata per mappare il corpo della richiesta POST inviata all'endpoint, all'istanza libro, che si desidera salvare.
Arrivati a questo punto non ci rimane che compilare ed eseguire l'API REST Spring Boot che hai creato. Per eseguire l'applicazione, eseguire direttamente mvn spring-boot:run sulla riga di comando dalla cartella del progetto di base in cui si trova pom.xml.
Altra alternativa per l’esecuzione sarebbe:
mvn package
java -jar target/spring-boot-rest-tutorial-0.0.1-SNAPSHOT.jar
Dopodiché la nostra applicazione sarà raggiungibile all’url: http://localhost:8080/.
Se l'applicazione si è avviata in modo corretto lo vedrai dai log che riporteranno quanto segue:
INFO 11044 --- [ restartedMain] c.s.s.SpringBootRestTutorialApplication : Started SpringBootRestTutorialApplication in 5.668 seconds (JVM running for 6.369)
INFO 11044 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
INFO 11044 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
INFO 11044 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms
Il codice sorgente completo del tutorial lo trovi quì.