SlideShare uma empresa Scribd logo
1 de 18
{
title : ‘

HATEOAS

’,

description : ‘Arquitetura REST 100% aderente’,

author : ‘Evandro Venancio’,
email: ‘evandro.venancio@gmail.com’,
twitter : ‘@evenancio’,
version : ‘1.0.0’,
date : ‘2013-12-07’

dependencies : {
skills : [
‘conhecimentos em desenvolvimento web’,
‘conhecimentos básico em REST’
}

}
REST
REpresentational

State

Transfer

(Transferência de Estado Representativo)
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
Proibida a utilização de rescrita
de URL para manter o estado.
Por favor, não insista.

URL
REWRITE

Uso sim, e daí?
Mas quem escreve
serviços RESTFul de
verdade???
Você já leu a tese
de doutorado do
Dr. Roy Fielding?
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
Quatro Princípios
Protocolo
Cliente/Servidor
sem Estado

Sintaxe
universal para
identificar os
recursos

Conjunto de
operações bem
definidas

Uso de
Hipermídias

HTTP contém
todas as
informações

Múltiplos
Endpoints
através de rotas

GET, POST,
DELETE, PUT

Proposta
HATEOAS

100 % Compliance
Proposta HATEOAS
Leonard Richardson

2008

The Maturity Heuristic
Uso de
Hipermídias

Conjunto de
operações bem
definidas
Sintaxe
universal para
identificar os
recursos
Protocolo
Cliente/Servidor
sem Estado

Richardson Maturity Model
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’
}
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’

}
}
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’

}
}
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
Protocolo
Cliente/Servidor sem
Estado

Sintaxe universal para
identificar os recursos

Conjunto de operações
bem definidas

Level 3: HATEOAS
Netflix = 100% REST Compliance

Uso de Hipermídias
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
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’,
}
HATEOAS
Frameworks
&
HAL
THE END
http://pt.wikipedia.org/wiki/REST
http://martinfowler.com/articles/richardsonMaturityModel.html
http://www.crummy.com/writing/speaking/2008-QCon/act3.html
http://msdn.microsoft.com/en-us/magazine/jj883957.aspx
http://www.infoq.com/news/2013/05/spring-hateoas-rest
http://stateless.co/hal_specification.html

Evandro Venancio
evandro.venancio@gmail.com
@evenancio

Mais conteúdo relacionado

Semelhante a HATEOAS - Arquitetura REST 100% aderente

Rest Java One
Rest Java OneRest Java One
Rest Java OneDextra
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]Igor Santos
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no androidAlexandre Antunes
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONAmbiente Livre
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONMarcio Junior Vieira
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de APISamuel Lourenço
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTMario Guedes
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTArrayOf.io
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 

Semelhante a HATEOAS - Arquitetura REST 100% aderente (20)

Rest Java One
Rest Java OneRest Java One
Rest Java One
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
 
REST-fuuuu
REST-fuuuuREST-fuuuu
REST-fuuuu
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSON
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSON
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
REST com Python
REST com PythonREST com Python
REST com Python
 
Te aula1
Te aula1Te aula1
Te aula1
 
Web apis
Web apisWeb apis
Web apis
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de API
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 

Último

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfNatalia Granato
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

HATEOAS - Arquitetura REST 100% aderente

  • 1. { title : ‘ HATEOAS ’, description : ‘Arquitetura REST 100% aderente’, author : ‘Evandro Venancio’, email: ‘evandro.venancio@gmail.com’, twitter : ‘@evenancio’, version : ‘1.0.0’, date : ‘2013-12-07’ dependencies : { skills : [ ‘conhecimentos em desenvolvimento web’, ‘conhecimentos básico em REST’ } }
  • 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í?
  • 5. Mas quem escreve serviços RESTFul de verdade??? Você já leu a tese de doutorado do Dr. Roy Fielding?
  • 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
  • 7. Quatro Princípios Protocolo Cliente/Servidor sem Estado Sintaxe universal para identificar os recursos Conjunto de operações bem definidas Uso de Hipermídias HTTP contém todas as informações Múltiplos Endpoints através de rotas GET, POST, DELETE, PUT Proposta HATEOAS 100 % Compliance
  • 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
  • 14. Protocolo Cliente/Servidor sem Estado Sintaxe universal para identificar os recursos Conjunto de operações bem definidas Level 3: HATEOAS Netflix = 100% REST Compliance Uso de Hipermídias
  • 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’, }