Guia Rapido Rest API
Guia Rapido Rest API
Guia de
Referência request
response
Rápida
headers
REST HTTP
URL
path
parameters
APIs query
parameters
2xx 3xx
Visão básica dos
principais status 4xx
codes
conceitos de 5xx
REST APIs
GET
verbos POST
PUT
Versionamento PATCH
Modelagem DELETE
Bounded
Context Segurança
Domain Driven
Design
Serviços
OpenId Connect
Entidades
verbos
OAuth 2.0
substantivos id
oliveira-michel.github.io
Por que REST API?
Guia de Referência Rápida
REST API
Assim como o inglês é tido como uma língua mais "padrão", o REST é tido como uma forma
de integração mais "padrão" do que as outras. Não significa que seja a melhor para todos os
cenários, mas é a mais popular, logo, amplamente suportada e conhecida pelo mercado,
linguagens e frameworks.
Agilidade
Facilmente encontrável
Negócios mudam mais
devagar do que seus clientes Analistas em novos projetos
e canais de venda. APIs conseguem encontrar as
permitem tirar lógica de funcionalidades já disponíveis
negócio dos canais de venda via APIs e sair usando.
tornando-os mais ágeis para
absorver as mudanças que o
mercado impõe.
Abstrai complexidade
Basta conectar um
1 Popularidade equipamento à tomada e ele
funciona sem que se conheça
O site detalhes da geração e
programmableweb.com, em transmissão da rede elétrica
2019, já listava mais de até a tomada.
22000 APIs públicas Da mesma forma, APIs
abstraem a complexidade dos
sistemas e expõe suas
funcionalidades em uma
É web
w interface simples e
ww
conhecida.
Por ser baseada no HTTP,
permite reaproveitar o
poder da infraestrutura
web já presente nas
empresas.
oliveira-michel.github.io
O que é?
É uma API que expõe estados de recursos e é implementada segundo um estilo Guia de Referência Rápida
arquitetural baseado no protocolo HTTP.
REST API
É o protocolo da web que é composto de: As REST APIs são construídas utilizando-
- método (verbs) que indicam a ação a ser feita; se dos mesmos elementos do HTTP:
- endereço (URL) de um recurso na rede; expõem as informações em URLs, filtra
- parâmetros de entrada (query strings) com query strings, manipula-as através dos
- mensagem de request; verbos etc.
- mensagem de response;
- headers com informações de controle;
- body com mensagem de response.
Quer ver na prática?
Identifique as partes do protocolo em uma página no Chrome. Aperte Ctrl+Shift+I
parameters
URLs status codes body
verbs headers
Histórico
<xml/> REST
<SOAP/>
2000
2006 2010+
2000 2003 2003
Yahoo e Google lançam REST é adotado pelas
Roy Thomas Fielding, XML endereçando melhor Dispositivos móveis e
XML RPC APIs usando JSON/RPC maiores empresas de
um dos criadores do banda limitada sofrem e populariam o formato
estrutura, segurança e TI e se torna o
pouco HTTP, escreve
padrões trouxe vários para processar grandes de mensagem mais leve padrão mais
padronizado dissertação que cria o
frameworks mensagens XML que XML conhecido e usado
REST
oliveira-michel.github.io
Os 5 Princípios
O estilo arquitetural REST é definido por basicamente 5 princípios. Guia de Referência Rápida
REST API
Cliente
Preocupa-se com User Experience, Servidor é desacoplado do cliente.
Interface e múltiplos dispositivos.
Cliente / Não compartilham nenhum código
Servidor Servidor no mesmo processo.
Preocupa-se com performance,
autenticação, autorização, escala, Podem evoluir em paralelo
cache, armazenamento e segurança.
Recursos
HTTP/1.1 GET http://api.viagens.com/v1/destinos/14/opinioes
Representação dos recursos
{json} <XML/>
Interface Mensagens auto-descritivas: metadados
Uniforme HTTP Status Code, content-type, accept, host
Hypermedia
Contrato Dados + Ações (Hypermedia As The Engine Of Application State)
REST API
Estado de um recurso
Alteração de estado
É o conjunto de atributos
Ex: Um veículo qualquer, se diferencia de outro
cujos valores representam o
por conta do conjunto de suas características
estado do recurso.
e normalmente uma delas é o identificador, pois
A proposta do REST é permitir
mesmo que as outras características mudem, o
as transferências, ou seja,
identificador nunca muda.
mudanças de estado dos
recursos.
Alteração de estado acontece quando uma ou
Exposição dos recursos mais características mudam.
{
Recursos são expostos "numeroDoChassi": "9BG114LW04C0001",
e representados via URL. As "ano": 2014, Hum ...
mudou o estado!
URLs devem ser definidas "marca": "GM", Maria Fernanda
"modelo": "Onix",
seguindo algumas boas práticas.
"proprietario": "José da Silva"
}
Exemplos
http://api.walmartlabs.com/v1/items/12417832
https://api.instagram.com/v1/users/{user-id}/relationship
base path recursos
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
/providers/Microsoft.DBforMySQL/servers/{serverName}
/databases/{databaseName}
Boas práticas
substantivos Use substantivos, não verbos Cliente(s) Use plurais Versione seus
verbos GET /clientes não /listarClientes > Todos os clientes: /clientes
/v2/ contratos na URL
> Cliente específico: /clientes/007 GET /v1/pagamentos
oliveira-michel.github.io
Verbos
Vêem do HTTP e indicam ao servidor qual ação (CRUD) deve ser aplicada um um Guia de Referência Rápida
determinado recurso representado por uma URL.
REST API
Inseguro Response:
POST Não idempotente HTTP 200 - Ok
Não usa cache
Caso a instância não exista, ele cria.
Solicita a criação de uma nova
instância de um recurso.
Inseguro
Request: Idempotente PATCH
POST http://api.com/usuarios Não usa cache
{“nome”: “Alguém”,
“e-mail”: “[email protected]”} Modifica parcialmente um recurso.
Response:
HTTP 201 - Created Request:
Location: /usuarios/abc123 PATCH /usuarios/abc123
{“nome”: “Alguém mudou só o nome”}
Response:
Seguro HTTP 200 - Ok
GET Idempotente
Pode usar cache
Inseguro
Solicita a representação de uma ou
Idempotente DELETE
Não usa cache
mais instâncias do recurso.
Apaga uma ou mais instâncias do
Request:
recurso.
GET /usuarios/abc123
Request:
Response:
DELETE http://api.com/usuários/abc123
HTTP 200 - Ok
{"id”: “abc123”, “nome”: “Alguém”,
Response:
“e-mail”: “[email protected]”}
HTTP 204 - No Content
{
Para os casos de "code": "10023",
"message": "Alguns campos estão preenchidos incorretamente.",
sucesso, o retorno da "details": "https://developer.empresa.com/apis/erros/10023",
requisição é o próprio "fields":[
{
recurso solicitdado. "name": "dataPedido",
"message": "O formato de data é inválido. Utilize data no padrão yyyy-MM-DD.",
Para os casos de erro, é "value": "01-05-2019",
"details": "https://developer.empresa.com/apis/erros/err-gen-086"
importante devolver um },
conteúdo, {
"name": "valorPagamento",
preferencialmente "message": "Valor não é number.",
padronizado, com mais "value": "R$ 27.568,90",
"details": "https://developer.empresa.com/apis/erros/err-gen-073"
detalhes sobre o }
problema. ]
}
oliveira-michel.github.io
Fluxo da requisição
Uma requisição e resposta em REST segue basicamente o funcionamento do protocolo Guia de Referência Rápida
HTTP.
REST API
Request
Informações do
remetente
Conteúdo da
Requisição: mensagem
relacionada ao
body recurso.
Endereço na rede do
Remetente: headers recurso sobre o qual se
Indica a ação a ser trata a requisição.
Destinatário: URL
aplicada em um Filtra indicando o
recurso: Complemento: query strings Indica o tipo de conteúdo
resultado
- Get + headers (representação),
esperado.
- Post + verbo informações de
- Put/Patch segurança e metadados
- Delete sobre a mensagem
Processamento
Response
O servidor pode
adicionar headers com
informações sobre a
resposta. Response:
body
oliveira-michel.github.io
Requisições assíncronas
Algumas mudanças de estado dos recursos podem não ser processadas imediatamente. Guia de Referência Rápida
Para isso, um fluxo para acompanhar o processamento se faz necessário.
REST API
1 Requisição para um recurso que demora para ser processado
Request:
POST /pintinhos
{
"nome": "Amarelinho",
"papai": "Sr. Crista",
"mamae": "Dona Carijó"
}
Request:
6 Consulta ao novo recurso para GET /ovinhos/59637
verificar o andamento
Response:
HTTP 200 Ok
! {
"id": 59637,
"situacao": "chocando",
"temperatura": 30,
"TTC": 2019-07-16T19:20:30.00-03:00,
"mensagens": [{
"codigo": "103",
"mensagem" : "Segundo o veterinário, tudo ok.",
"tipo": "info"
Request: }]
GET /ovinhos/59637 }
Response:
HTTP 303 See Other
{
"id": 59637, 7 Consulta ao novo recurso criado
"situacao": "nasceu",
"temperatura": null, Request:
"TTC": null
"mensagens": [] :) GET /pintinhos/2368
Response:
}
HTTP 200 Ok
Location: /ovinhos/59637 {
Content-Location: /pintinhos/2368 "id": 2368,
"nome": "Amarelinho",
!
"papai": "Sr. Crista",
O fluxo descrito se chama pooling, alternativamente, ao "mamae": "Dona Carijó",
solicitar a criação do "Amarelinho", o "Sr. Crista" poderia "idade": 1
informar seu endereço e quando o "Amarelinho" nascesse, }
ele receberia a informação o "Amarelinho" diretamente no
seu endereço. Este processo é o que chamamos de Call
Back.
oliveira-michel.github.io
Query strings
Presentes na URL, é um conjunto de 'chave=valor' que inicia com o caractere '?' e são Guia de Referência Rápida
separados por '&'. Normalmente indicarão filtros.
REST API
Alguns comportamentos se repetem em praticamente
todas as APIs, por isso, alguns padrões para as query Para pesquisas em qualquer atributo,
strings podem ser convencionados e adotados por todos é possível usar a "forma Google" de
os sistemas da empresa. pesquisar.
Ordenação pode ser feita com uma estrutura de sort. Você pode devolver respostas
parciais dos recursos que têm muitos
sort=[{atributo}:{asc|desc}] atributos.
GET /cartoes/123
E se um determinado conjunto de
+ GET /cartoes/123/faturas/18
atributos é sempre requisitado, pode-
= GET /cartoes/123?expand=faturas&faturas.id=18 se definir "views".
200 Ok
{ "id": 123, GET /clientes/123?view=contatos
200 Ok
"numero": "5436 **** **** 3658",
{ "nome": "José",
"faturas"= [
{ "email": "@",
"endereco": "Rua A",
"id": 18,
"telefone": "912345678" }
"vencimento": 2020-06-18,
"valor": 2365.48
}
]
} Pode usar todos juntos? Sim!
oliveira-michel.github.io
HATEOAS
Hypermedia As The Engine Of Application State é capacidade pela qual um cliente pode Guia de Referência Rápida
interagir com a API através de links informados pelo servidor.
REST API
Como funciona
Em cada resposta da API, ela deve prover links que permitam que o cliente descubra todas
as possibilidades de alteração do estado de um recurso à partir do estado atual.
Request:
POST /consultas
{
"idMedico": "antonio59", Richardson Maturity Model
"inicio": "14:00",
"fim": "14:30",
"idPaciente": "jose85" Glory of
}
REST
Response:
HTTP 201 Created
{ Controle de
"data": { Hipermedia
"id": "123",
"idMedico": "antonio59",
"inicio": "14:00", Verbos HTTP
"fim": "14:30",
"idPaciente": "jose85"
},
"links":[ Recursos
{"rel": "self",
"href": "/consultas/123",
"title": "Esta consulta",
"method": "GET"}, Pântano de POX
{"rel": "cancelar",
"href": "/consultas/123",
"title": "Cancelar consulta",
"method": "DELETE"},
Leonard Richardson, autor de um
{"rel": "alterar", dos primeiros grandes livros de
"href": "/consultas/123", REST criou um modelo de
"title": "Alterar horário desta consulta",
"method": "PATCH"},
maturidade que representa os
{"rel": "agendamentos-medico", passos para a adoção das práticas
"href": "/medicos/antonio59/consultas", REST.
"title": "Listar consultas para o médico",
"method": "GET"},
{"rel": "agendamentos-paciente", Ele percorre desde o pântano de
"href": "/consultas?paciente=jose85", Plain Old XML (POX), quando não
"title": "Listar consultas do paciente", haviam padrões para troca de
"method": "GET"}
] mensagens, passa por separar bem
} os recursos em URLs, usar
corretamente os verbos do HTTP e
códigos de resposta e por fim, o
uso de HATEOAS.
oliveira-michel.github.io
Modelagem
É o processo de entender a demanda de negócio e transformá-la em recursos expostos Guia de Referência Rápida
via URL respeitando os padrões arquiteturais e regras do REST.
REST API
Contract First
Exemplo
Trabalhar em produzir um bom contrato de
API antes de começar o desenvolvimento do
código: openapi: 3.0.0
info:
title: Sample API
- faz com que muitas dúvidas apareçam e description: Sample API documentation.
sejam sanadas com antecedência; version: 0.1.9
servers:
- url: http://api.example.com/v1
- traz um entendimento mais completo do description: Main (production) server
negócio; - url: http://staging-api.example.com
description: Internal staging server for testing
paths:
- evita impedimentos e retrabalho durante o /users:
desenvolvimento; get:
summary: Returns a list of users.
responses:
- permite que o cliente possa adiantar o '200': # status code
desenvolvimento antes da API estar pronta. description: A JSON array of user names
content:
application/json:
O contrato, que contém cada item presente schema:
nas REST APIs , como URLs, path parameters, type: array
items:
query parameters, headers etc., assim como type: string
descrições e exemplos, pode ser utilizado /users/{userId}:
para: get:
summary: Returns a user by ID.
parameters:
- geração de código fonte para implementação - name: userId
em diversas linguagens; in: path
required: true
description: User Identification.
- geração de documentação web publicável, schema:
type : integer
navegável e que é capaz de fazer chamas às format: int64
APIs; minimum: 1
responses:
'200':
- configuração de API Gateways; description: OK
https://github.com/OAI/OpenAPI-Specification/blob
/master/versions/3.0.2.md
oliveira-michel.github.io
Versionamento
Mais de uma versão de API pode existir ao mesmo tempo, visando manter Guia de Referência Rápida
compatibilidade com os clientes antigos.
REST API
1 - Todos os clientes na v1
Ao alterar o documento do contrato da
API, é interessante adotar o
versionamento semântico para controlar o
artefato. 2 - A v1 faz proxy
Incrementa ao para a implementação
2 . 3 . 1 fazer ajustes que
não alteram
da v2. Os clientes são
major.minor.patch tecnicamente o /v1/ solicitados para
contrato, como migrar para a v2.
exemplos,
descrições etc.
3 - Todos os clientes
migraram para a v2.
Incrementa ao
fazer ajustes que Incrementa ao fazer A v1 é desligada.
alteram ajustes que alteram
tecnicamente o tecnicamente o
contrato e contrato sem causar
causam erro no erro no cliente que /v1/ /v2/
cliente que já usa. já usa.
http://api.com/vendas/v2 X
/v1/ /v2/
oliveira-michel.github.io
OpenID Connect e OAuth 2.0
OpenID Connect é uma camada de identificação do usuário que roda sobre o OAuth 2.0. Guia de Referência Rápida
O OAuth 2.0 é um padrão para autorizar acessos sem ficar trafegando senhas.
REST API
OpenId Connect
Permite que o sistema A acesse o sistema B em nome do cliente sem que o sistema A tenha
acesso às credenciais do cliente (login e senha). A requisição de acesso gera um token e
este token pode ser revogado por vontade do cliente diretamente no sistema B.
OAuth 2.0
Exemplo de fluxo Client Credentials do OAuth 2.0. O Sistema de Vendas não conhece as
credenciais do Sistema Cliente da API e confia no Security Token Service para validar o
token.
oliveira-michel.github.io