O que eh esse tal de Rest?
Conceito e Exemplos de Aplicação
No mundo do desenvolvimento de software, as APIs (Interfaces de Programação de Aplicações) são fundamentais para permitir que diferentes sistemas se comuniquem entre si. Dentre os diversos estilos de arquitetura para APIs, o REST é um dos mais populares. Mas o que exatamente é uma API REST? Neste artigo, vamos explicar o conceito, suas principais características e apresentar alguns exemplos práticos de aplicação.
O Que É uma API REST?
API REST (ou RESTful API) é uma interface de programação baseada nos princípios da arquitetura REST (Representational State Transfer), proposta por Roy Fielding em sua tese de doutorado em 2000. REST não é um protocolo, mas sim um estilo arquitetural que define um conjunto de restrições para criar serviços web escaláveis e simples.
Em uma API REST, os recursos (dados ou funcionalidades) são representados por URLs, e as operações sobre esses recursos são realizadas utilizando os métodos do protocolo HTTP, como:
- GET – Recupera informações de um recurso.
- POST – Cria um novo recurso.
- PUT – Atualiza um recurso existente.
- DELETE – Remove um recurso.
Características de uma API RESTful
Para que uma API seja considerada RESTful, ela deve seguir algumas características:
- Cliente-Servidor: O cliente (por exemplo, um aplicativo web) e o servidor (onde a API está hospedada) são independentes.
- Sem Estado (Stateless): Cada requisição feita à API deve conter todas as informações necessárias para o servidor entendê-la. O servidor não armazena o estado do cliente entre as requisições.
- Cacheável: As respostas da API podem ser armazenadas em cache para melhorar o desempenho.
- Interface Uniforme: A forma de acessar os recursos é padronizada, tornando a API mais intuitiva e fácil de usar.
- Baseada em Recursos: Tudo é tratado como um recurso, que pode ser manipulado por meio de URLs e métodos HTTP.
Exemplo Simples de API REST
Imagine um sistema que gerencia uma lista de tarefas (to-do list). A API REST poderia funcionar da seguinte forma:
MétodoEndpointAçãoGET/tarefasLista todas as tarefasGET/tarefas/1Detalha a tarefa com ID 1POST/tarefasCria uma nova tarefaPUT/tarefas/1Atualiza a tarefa com ID 1DELETE/tarefas/1Exclui a tarefa com ID 1
Exemplos Reais de Aplicação
1. Aplicações Web e Mobile
APIs REST são amplamente usadas para conectar front-ends (como aplicativos React, Angular ou Flutter) com back-ends. Por exemplo, um aplicativo de e-commerce consulta uma API REST para obter produtos, realizar login ou efetuar pedidos.
2. Integrações com Plataformas Externas
Serviços como PayPal, Stripe, Google Maps, Twitter e Spotify oferecem APIs REST para que desenvolvedores integrem suas funcionalidades em outras aplicações. Um exemplo comum: integrar o Google Maps para exibir localizações em um site.
3. Microserviços
Em arquiteturas modernas, como microserviços, cada serviço independente se comunica com os outros por meio de APIs REST, promovendo modularidade e escalabilidade.
4. Internet das Coisas (IoT)
Dispositivos conectados, como sensores e assistentes virtuais, usam APIs REST para enviar e receber dados em tempo real de servidores ou outras aplicações.
Conclusão
As APIs REST tornaram-se uma peça essencial na construção de aplicações modernas, permitindo uma comunicação eficiente entre sistemas distribuídos. Sua simplicidade, escalabilidade e uso de padrões abertos como HTTP a tornam uma das escolhas preferidas por desenvolvedores e empresas em todo o mundo.
Se você está construindo ou integrando sistemas, entender o funcionamento de APIs REST é um passo fundamental para criar soluções eficazes, interoperáveis e modernas.
Exemplo de API REST em Java com Spring Boot
Vamos construir uma API REST básica para gerenciar uma lista de tarefas (to-do list). A aplicação permitirá:
- Listar tarefas
- Criar uma nova tarefa
- Atualizar uma tarefa
- Deletar uma tarefa
1. Dependências (pom.xml)
Se você estiver usando Maven, inclua essas dependências no seu pom.xml
:
xml
Copiar código
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2. Classe de Entidade: Tarefa.java
java
Copiar código
import jakarta.persistence.*;
@Entity
public class Tarefa {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String descricao;
private boolean concluida;
// Getters e Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getDescricao() { return descricao; }
public void setDescricao(String descricao) { this.descricao = descricao; }
public boolean isConcluida() { return concluida; }
public void setConcluida(boolean concluida) { this.concluida = concluida; }
}
3. Repositório: TarefaRepository.java
java
Copiar código
import org.springframework.data.jpa.repository.JpaRepository;
public interface TarefaRepository extends JpaRepository<Tarefa, Long> {
}
4. Controlador REST: TarefaController.java
java
Copiar código
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/tarefas")
public class TarefaController {
@Autowired
private TarefaRepository tarefaRepository;
@GetMapping
public List<Tarefa> listarTarefas() {
return tarefaRepository.findAll();
}
@GetMapping("/{id}")
public Optional<Tarefa> buscarTarefa(@PathVariable Long id) {
return tarefaRepository.findById(id);
}
@PostMapping
public Tarefa criarTarefa(@RequestBody Tarefa tarefa) {
return tarefaRepository.save(tarefa);
}
@PutMapping("/{id}")
public Tarefa atualizarTarefa(@PathVariable Long id, @RequestBody Tarefa novaTarefa) {
return tarefaRepository.findById(id).map(tarefa -> {
tarefa.setDescricao(novaTarefa.getDescricao());
tarefa.setConcluida(novaTarefa.isConcluida());
return tarefaRepository.save(tarefa);
}).orElseGet(() -> {
novaTarefa.setId(id);
return tarefaRepository.