Construindo APIs
RESTful com Spring
E aí véi!
Mateus Malaquias
Senior Software Developer
@mmalaquiasdev
http://bit.ly/malaquiaslinkedin
▣ https://soujava.org.br
▣ https://twitter.com/soujava
▣ http://bit.ly/soujava-youtube
▣ https://medium.com/collabcode
▣ https://twitter.com/collabcodetech
▣ https://www.facebook.com/collabcode
AGENDA
▣ URI
▣ Recursos
▣ Verbos HTTP
▣ Status Code
▣ Media Types
▣ Filtros e paginação
▣ Caching
▣ Versionamento
▣ Documentação
▣ Modelo de Maturidade de
Richardson (HATEOAS)
1.
Um breve
contexto
Antes de qualquer
coisa precisamos
entenderalgumas
coisas…
O termo é REST ou RESTful?
▣ Rest é um estilo arquitetural
que foi criado por Roy
Fielding.
▣ RESTful é o design dos
contratos de APIs que
respeita os conceitos REST.
REST vs SOAP
Spring MVC
▣ É um action Web MVC framework que é suportado pelo Spring
Boot e os convencionais servidores Java.
▣ É muito utilizado para implementação de aplicações Web ou
para REST APIs.
▣ Ele possui uma implementação do pattern FrontController que
basicamente é responsável por receber todas as requisições,
delega-las para os respectivos controllers e retornar a devida
resposta.
‘’
Qual a diferença entre MVC action
based e component based?
Leia mais:
http://bit.ly/actionoucomponent
2.
URI
Uniform Resource
Identifier
Estrutura básica [ 1 ]
https://api.twitter.com/1.1/search
Seu domínio
HTTPS
ou
HTTP
Recursos e
Parâmetros
Versão da API
(opcional)
Estrutura básica [ 2 ]
https://api.fcamara.com.br/vagas/curriculos
Seu domínio
HTTPS
ou
HTTP
Recursos e
Parâmetros
Nome da API
(opcional)
‘’
▣ Identificador de Recursos Universal,
como diz o próprio nome, é o
identificador do recurso. Pode ser
uma imagem, uma página, etc, pois
tudo o que está disponível na
internet precisa de um identificador
único para que não seja confundido.
▣ Leia mais: http://bit.ly/urlvsuri
3.
Recursos
Utilize substantivos,
evite verbos e não use
nome de funções
Coleção e elemento
…/vagas/criarCurriculo
…/vagas/getTodosCurriculos
Coleção e elemento
…/vagas/curriculos
…/vagas/curriculos/29
Sub-elementos
…/vagas/curriculos/29/certificados/2
‘’
▣ Ao usar sub-elementos tenha
um cuidado a mais para para
evitar encadeamentos, pois
pode de dificultar a evolução da
API.
Encadeamento de sub-elementos
…/29/certificados/2/servidores
…/29/certificados/2/servidores/892
4.
Verbos HTTP
O mínimo que você
precisa saber sobre:
GET, POST, PUT,
DELETE...PATCH e
OPTIONS.
GET: Um método de consulta
▣ Cacheável
GET …/usuarios
GET …/usuarios/301
POST: Um método para criação
▣ Não é Cacheável
▣ Informações são transitadas no corpo da requisição
POST …/usuarios
{
"username": "Malaquias",
"password": "123456",
"city": "Salvador",
"interests": "Java"
}
PUT: Um método para atualização
▣ Não é Cacheável
▣ Informações são transitadas no corpo da requisição
PUT …/usuarios/301
{
"username": "Malaquias",
"password": "123456",
"city": “São Paulo",
"interests": "Java"
}
DELETE: Um método para remoção
▣ Não é Cacheável
DELETE …/usuarios
DELETE …/usuarios/301
PATCH: Um método para atualização parcial
▣ Não é Cacheável
PATCH …/usuarios/301
{
"password": “ab21ac2",
}
OPTIONS: Quais verbos posso usar?
OPTIONS …/usuariosHTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0
DEMO
5.
Status Code 200, 400 ou 500?
As familias mais utilizadas
4xx2xx 5xx
Tá tudo bem O cliente fez
algo que eu
não entendi
Ops! Quebrei
As vezes você se depara com isso...
POST …/usuarios
HTTP/1.1 200 OK
{
"codigo":"-99",
"msg":"Error interno"
}
A familia 200
2xx
Tá tudo bem
Status: 200 OK
GET …/usuarios
[
{
"id":"421524",
"nome":"Mateus",
"senha":"123456",
"email":"mateusmalaquiasdev@outlook.com"
},
...
]
Status: 201 Created
OU
{
"telefone":"11999999999"
}
HTTP/1.1 201 Created
Location: …/usuarios/421524/telefones
POST …/usuarios/421524/telefones
Status: 202 Accepted
{
"href":"/usuarios/421524/documentos/2130040"
}
POST …/usuarios/421524/documentos
A familia 400
4xx
O cliente fez
algo que eu
não entendi
Status: 400 Bad Request
POST …/usuarios
{
"status":400,
"msg":"Nome do usuário não pode ser nulo ou vazio",
"doc":"https://api.fcamara.com.br/erros/nome-usuario"
}
Status: 404 Not Found
GET …/usuarios/64721
{
"status":404,
"msg":“Usuário não foi encontrado",
"doc":"https://api.fcamara.com.br/erros/usuario-nao-existe"
}
Os mais utilizados
401 Unauthorized
403 Forbidden
404 Not Found
429 Too Many Requests
A familia 500
5xx
Ops! Quebrei
Status: 500 Internal Server Error
POST …/usuarios
{
"status": 500,
"msg": "Ops! Aconteceu um erro um interno“
}
‘’
▣ Lista completa de status
https://httpstatuses.com/
DEMO
6.
Media Types
Basicamente
trabalhamos
com um tipo
JSON vs XML
E no Header como é que fica?
OPTIONS …/usuarios
HTTP/1.1 200 OK
Server: Apache/2.0.61 (Unix)
Accept: application/json
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: application/json
7.
Filtros e paginação Tudo tem um limite
Filtros com escopo
GET …/usuarios?status=ativos&nome=Ma
Filtros com respostas parciais
GET …/usuarios/1?fields=nome,email
‘’
▣ Gosto de pensar no Graphql
como uma forma de
desenvolver uma API orientado
a tipos, pois tudo no Graphql se
resume a tipos e resolvers.
▣ Leia mais: http://bit.ly/2uU0eSb
Paginação das suas coleções
GET …/usuarios?page=10&size=50
Quem controla o limit é a API
GET …/usuarios?page=5&size=500
DEMO
8.
Caching
Evite uma super
lotação
Fazer caching é uma boa prática!
▣ Vamos evitar tráfego
▣ Diminuir a latência de rede
▣ Evitar que nossos servidores fiquem
sobrecarregados
Mas temos que ter cuidado com...
▣ O tempo que vamos invalidar o cache
▣ Se alguma ação vai invalidar o cache
▣ Faz clusters? Como sincronizar o cache?
DEMO
9.
Versionamento
Eu prefiro ser essa
metamorfose
ambulante
As coisas mudam
Dificilmente uma API será completamente estável, mudanças são
sempre inevitáveis, então é importante para o seu negócio que
você consiga caminhar sem quebrar.
Voltamos a estrutura básica [ 1 ]
https://api.twitter.com/1.1/search
Versão da API
(opcional)
Quando uma versão muda?
https://api.twitter.com/1.2/search
Quando uma versão muda?
https://api.twitter.com/2.0/search
10.
Documentação
O guia dos
mochileiros das APIs
Uma boa documentação tem...
▣ Descrição, tutoriais de uso e exemplos
▣ Ela pode ou não ser interativa
▣ Está sempre atualizada
▣ Quando se tem muitas APIs, um catalogo é
uma opção interessante de se ter
Swagger
▣ Modelagem da API
▣ Geração de documentação (legível) da API
▣ Geração de códigos do Cliente e do Servidor, com suporte a
várias linguagens de programação
▣ No Java usamos anotações para gerar a documentação
O Swagger é um projeto composto por algumas ferramentas que
auxiliam o desenvolvedor de APIs REST
DEMO
11.
Modelo de
Maturidade de
Richardson
(HATEOAS)
Em busca da glória do
REST
Nível 0 - POX
HTTP URI OPERAÇÃO
GET /getUsuarios/1 Retorna
POST /criarUsuarios Cria
POST /atualizarUsuarios/1 Atualiza
POST /deleteUsuarios/1 Deleta
É o nível mais baixo de uma API RESTful, aqui não se usa padrão
para praticamente nada.
Nível 1 – Recursos [ 1 ]
HTTP URI OPERAÇÃO
GET usuarios/1/buscar Retorna
POST usuarios/criar Cria
POST usuarios/1/atualizar Atualiza
POST usuarios/1/deletar Deleta
Se usa pelo menos os recursos como uma forma de modelar e
organizar APIs.
Nível 1 – Recursos [ 2 ]
HTTP URI OPERAÇÃO
GET usuarios/1 Retorna
POST usuarios Cria
PUT usuarios/1 Atualiza
DELETE usuarios/1 Deleta
Se usa pelo menos os recursos como uma forma de modelar e
organizar APIs.
Nível 2 – Verbos HTTP
HTTP URI OPERAÇÃO STATUS
GET usuarios/1 Retorna 200, 400, 500
POST usuarios Cria 200, 400, 500
PUT usuarios/1 Atualiza 200, 400, 500
DELETE usuarios/1 Deleta 200, 400, 500
Aqui já se utiliza os verbos HTTP e os STATUS code na execução
de uma operação.
Nível 2 – Hypermedia
Tem como elemento principal a representação hypermedia,
permitindo que um documento descreva seu estado atual, e o
seu relacionamento com outros elementos ou futuros estados.
Link de exemplo: https://pokeapi.co/
OBRIGADO
POR NÃO
DORMIR!
Perguntas?
@mmalaquiasdev
mateusmalaquiasdev@outlook.com

Construindo APIs RESTful com Spring