O documento discute a arquitetura REST e o modelo de maturidade Richardson, com foco na proposta HATEOAS (Hypermedia As The Engine Of Application State) para alcançar 100% de conformidade REST. Apresenta os quatro princípios fundamentais de REST e os três níveis do modelo de maturidade, culminando no nível 3 que implementa HATEOAS usando hipermídia para controlar o estado e a navegação entre recursos.
3. O que é estado?
> Preciso saber onde estou
> Preciso saber para onde posso
ir
> Preciso apresentar o meu
crachá para onde posso ir
permitir a minha entrada
> Eu não quero passar carão, por
isto me dê o crachá correto e os
lugares onde realmente posso ir
com ele
4. Proibida a utilização de rescrita
de URL para manter o estado.
Por favor, não insista.
URL
REWRITE
Uso sim, e daí?
6. Observe:
“A REST (Transferência do Estado
Representativo) é pretendida como uma
imagem do design da aplicação se
comportará: uma rede de websites (um
estado virtual), onde o usuário progride
com uma aplicação selecionando as
ligações (transições do estado), tendo
como resultado a página seguinte (que
representa o estado seguinte da
aplicação) que está sendo transferida ao
usuário e apresentada para seu uso.” –
Dr. Roy Fielding, pai do REST
9. Uso de
Hipermídias
Conjunto de
operações bem
definidas
Sintaxe
universal para
identificar os
recursos
Protocolo
Cliente/Servidor
sem Estado
Richardson Maturity Model
10. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 0: Uma única URI e um único HTTP
method
Não chamem isto de REST em respeito ao criador da arquitetura!
POST http://domain.me/aceitamostudoservice
HTTP/1.1 200 OK
{ gravarProdutoRequest : {
nome : ‘titulo’,
categoria: ‘livro’
}
}
{
id_produto: 1044,
nome: ‘titulo’,
categoria: ‘livro’,
status : ‘INCLUIDO’
}
POST http://domain.me/aceitamostudoservice
HTTP/1.1 200 OK
{ alterarClienteRequest : {
id_cliente : 123,
nome: ‘Ele mesmo’,
telefone: ‘11 4444-3333’
}
}
{
id_cliente: 123,
nome: ‘Ele mesmo’,
telefone: ’11 4444-3333’,
status : ‘ALTERADO’
}
11. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 1: Diversas URI e um único HTTP
method
Já está melhorando...
POST http://api.domain.me/produto/gravar
HTTP/1.1 200 OK
{
{
nome : ‘titulo’,
categoria: ‘livro’
id_produto: 1044,
nome: ‘titulo’,
categoria: ‘livro’,
status : ‘INCLUIDO’
}
}
POST http://api.domain.me/cliente/123/alterar
HTTP/1.1 200 OK
{
{
nome: ‘Ele mesmo’,
telefone: ‘11 4444-3333’
id_cliente: 123,
nome: ‘Ele mesmo’,
telefone: ’11 4444-3333’,
status : ‘ALTERADO’
}
}
12. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 2: Diversas URI e diversos HTTP
methods
Este é o cenário mais comum. Estamos quase lá!
POST http://api.domain.me/produto
HTTP/1.1 200 OK
{
{
nome : ‘titulo’,
categoria: ‘livro’
id_produto: 1044,
nome: ‘titulo’,
categoria: ‘livro’,
status : ‘INCLUIDO’
}
}
PUT http://api.domain.me/cliente/123
HTTP/1.1 200 OK
{
{
nome: ‘Ele mesmo’,
telefone: ‘11 4444-3333’
id_cliente: 123,
nome: ‘Ele mesmo’,
telefone: ’11 4444-3333’,
status : ‘ALTERADO’
}
}
13. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 3: HATEOAS
Hypermedia As The Engine Of Application State
> Estamos falando de onde você
pode ir com o seu crachá –
estado futuro da aplicação
> Estamos falando de definição
de fronteiras e navegação
orientada
> Estamos falando de fazer tudo
isto utilizando Hipermídia
15. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 3: HATEOAS
Show!
> O cliente sabe para onde pode
ir agora
> A descoberta dos serviços
disponíveis é dinâmica – logo, o
Netflix pode alterar a URL de
seus serviços sem se preocupar
com os seus usuários
> Estamos vendo o controle de
estado através de hipermídias
16. Protocolo
Cliente/Servidor sem
Estado
Sintaxe universal para
identificar os recursos
Conjunto de operações
bem definidas
Uso de Hipermídias
Level 3: HATEOAS
Como ficaria no nosso caso?
POST http://api.domain.me/produto
{
nome : ‘titulo’,
categoria: ‘livro’
}
HTTP/1.1 200 OK
{
_links: {
details: { href: ‘/produto/1044’, rel: ‘/docs/api/selfProduct’ },
update: { href: ‘/produto/1044/update’, rel: ‘/docs/api/updateproduct’ },
delete: { href: ‘/produto/1044/delete’, rel: ‘/docs/api/deleteProduct’ },
addBasket: { href: ‘/basket?productId=1044’, rel: ‘/docs/api/addInBasket’ }
},
id_produto: 1044,
nome: ‘titulo’,
categoria: ‘livro’,
status : ‘INCLUIDO’,
}