Como criar uma API REST com Spring Boot

Como criar uma API REST com Spring Boot

A sigla REST significa REpresentational State Transfer, enquanto API significa Application Programming Interface. Juntos, eles se referem a uma API REST. Uma API REST é um serviço que transfere solicitações e respostas entre dois sistemas de software, em uma arquitetura REST.

A arquitetura REST cria serviços da Web acessíveis por meio de URLs usando um dos quatro verbos de solicitação: POST, GET, PUT e DELETE. Então, você poderia dizer que uma API REST é um software que permite criar, ler, atualizar e excluir recursos por meio de URLs.

Você pode aprender como criar uma API REST usando Spring Boot.

Inicializando o aplicativo Spring Boot

A primeira coisa que você deve fazer é se familiarizar com o básico do Spring e configurar um aplicativo Spring Boot. Você precisará alterar as dependências, no entanto. Além da dependência da Web, você precisará obter a dependência do Spring Data Java Persistent API (JPA) e o driver do banco de dados que pretende usar (este aplicativo usará o MySQL).

Para esta API REST, você precisará de um controlador, um modelo e um repositório. Assim, a API REST terá a seguinte estrutura de arquivos:

Estrutura de arquivo da API REST

Criando o modelo

A primeira classe que você precisará criar é o modelo de cliente, que armazena a lógica de dados.

package com.onlineshopaholics.api.model;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Table(name="customer")
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name="customername")
    private String name;

    private String email;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Na classe de cliente acima, você verá que cada cliente terá um ID, nome e e-mail. Você também notará várias anotações que atendem a propósitos diferentes.

  • @Entity: Declara a classe cliente como uma entidade JPA. Isso significa que o JPA usará os campos da classe para criar colunas em um banco de dados relacional.
  • @Table: Designa o nome da tabela que será mapeada para a classe de modelo do cliente.
  • @Id: Designa uma propriedade que identificará exclusivamente a entidade no banco de dados.
  • @GeneratedValue e @GenerationType: trabalham juntos para especificar uma estratégia de geração automática para o campo ao qual está associado. Assim, o campo id irá gerar automaticamente um valor único cada vez que você criar um novo cliente.
  • @Column: Designa uma propriedade que mapeia para uma coluna no banco de dados. Portanto, a propriedade name será mapeada para uma coluna customername no banco de dados.

Criando o repositório

Este repositório permitirá que você interaja com os dados do cliente no banco de dados.

package com.onlineshopaholics.api.repository;

import org.springframework.data.repository.CrudRepository;
import com.onlineshopaholics.api.model.Customer;

public interface CustomerRepository extends CrudRepository<Customer, Integer>{}

O repositório do cliente estende a interface CrudRepositoy<T,ID> do Spring , passando a classe de modelo Customer junto com o tipo do identificador exclusivo da entidade, Integer.

A interface CrudRepository fornece acesso a mais de 10 operações, incluindo os métodos CRUD genéricos necessários para a API REST. Portanto, como o CrudRepository já define os métodos necessários, não há necessidade de declará-los explicitamente na interface CustomerRepository.

Criando o controlador

O controlador permite que você atualize os dados em seu banco de dados usando o modelo e o repositório.

package com.onlineshopaholics.api.controller;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.onlineshopaholics.api.model.Customer;
import com.onlineshopaholics.api.repository.CustomerRepository;

@RestController
@RequestMapping("/customers")
public class CustomerController {
    @Autowired
    private CustomerRepository customerRepository;

    // create new customer
    @PostMapping("/add")
    public Customer addNewCustomer(@RequestBody Customer newCustomer){
        Customer user = new Customer();
        user.setName(newCustomer.getName());
        user.setEmail(newCustomer.getEmail());
        customerRepository.save(user);
        return user;
    }

    // view all customers
    @GetMapping("view/all")
    public @ResponseBody Iterable<Customer> getAllCustomers(){
        return customerRepository.findAll();
    }

    // view specific customer
    @GetMapping("view/{id}")
    public Optional<Customer> getCustomer(@PathVariable Integer id) {
        return customerRepository.findById(id);
    }

    // update an existing customer
    @PutMapping("/edit/{id}")
    public String update(@RequestBody Customer updateCustomer, @PathVariable Integer id) {
        return customerRepository.findById(id)
                 .map(customer -> {
                       customer.setName(updateCustomer.getName());
                       customer.setEmail(updateCustomer.getEmail());
                       customerRepository.save(customer);
                       return "Customer details have been successfully updated!";
                 }).orElseGet(() -> {
                       return "This customer doesn't exist";
                 });
    }

    // delete customer
    @DeleteMapping("delete/{id}")
    public String delete(@PathVariable("id")Integer id) {
        customerRepository.deleteById(id);
        return "Customer has been successfully deleted!";
    }
}

O controlador acima equipa a API REST com operações CRUD, usando cinco dos métodos de interface CrudRepository<T,ID> (cada um atribuído a um método específico). O controlador também usa várias anotações importantes do Spring que permitem que ele execute suas funções.

  • @RestController: esta anotação serve a dois propósitos. Ele marca uma classe para descoberta por varredura de componentes. Ele também diz ao Spring para escrever o valor de retorno para todos os métodos, nesta classe, no corpo da resposta.
  • @RequestMapping: define o padrão de solicitação de linha de base que o controlador manipulará. Assim, este controller irá tratar todas as requisições para “/customers”.
  • @ResponseBody: permite que um método retorne uma entidade inteira.
  • @RequestBody: Permite converter o corpo da solicitação em um objeto.
  • @RequestParam: permite isolar uma propriedade de um objeto.
  • @PathVariable: permite mapear um valor de solicitação para um espaço reservado. Ele mapeia o ID fornecido ao método delete com um valor existente no banco de dados.
  • @PostMapping: Permite criar recursos.
  • @GetMapping: permite que você leia dados de recursos.
  • @PutMapping: Permite atualizar recursos.
  • @DeleteMapping: permite excluir recursos.

Conectando o banco de dados ao seu aplicativo

Para conectar um banco de dados a qualquer aplicativo Spring, você precisará usar o arquivo application.properties na pasta de recursos. Este arquivo está inicialmente vazio, então você pode preenchê-lo com as propriedades apropriadas para o banco de dados que você pretende usar. Esta aplicação utilizará um banco de dados MySQL, portanto, o arquivo application.properties conterá os seguintes dados:

spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/onlineshopaholics
spring.datasource.username=root
spring.datasource.password=securepw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

Os dados acima mostram que este aplicativo se conectará a um banco de dados MySQL chamado onlineshopaholics, com um nome de usuário “root” e “securepw” como senha. Sua próxima etapa é criar o banco de dados e a tabela de clientes no MySQL.

Criando solicitações

Existem muitas ferramentas que você pode usar para testar sua API REST. Postman é uma ferramenta de teste de API REST popular e você pode usá-la para testar a API simples que você criou. Depois de criar a tabela MySQL e executar o aplicativo Spring, você pode iniciar o Postman e experimentar os quatro verbos de solicitação.

Solicitação POST

Essa solicitação permitirá que você crie novos clientes usando a API REST. Para concluir esta solicitação, você precisará ir para a seção de cabeçalhos de sua solicitação de postagem e criar um novo cabeçalho (Tipo de conteúdo). Você deve definir o valor desse cabeçalho como application/json, pois estará criando novos clientes usando JSON.

Cabeçalho da postagem da API REST

No corpo da requisição, você precisará alterar o tipo para raw e inserir seu JSON. Em seguida, você precisará inserir o URL da postagem:

Corpo da postagem da API REST

O envio da solicitação retornará a seguinte resposta:

Resposta da postagem da API REST

Você pode ver que a solicitação foi bem-sucedida e que o novo cliente também possui um id.

Solicitação GET

Agora que você tem um cliente, pode visualizá-lo com a solicitação get que retorna todos os clientes:

API REST obter resposta

Ou cada cliente por id:

API REST obtém por resposta de ID

Solicitação PUT

Você pode atualizar Janet com um novo sobrenome e e-mail.

API REST colocar resposta

Apagar solicitação

Você também pode excluir Janet do banco de dados.

Resposta de exclusão da API REST

Teste sua API REST Spring usando JUnit

Com o Spring Boot, você pode testar qualquer aplicativo (incluindo APIs REST) ​​usando o arquivo de teste do Spring. O teste de software é importante para o Spring Boot. Cada aplicativo Spring inicializado usa JUnit para teste e permite que você envie solicitações para suas APIs REST.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *