rest: padrões e melhores práticas

69
© Copyright | www.sensedia.com 1 [ Empowering Business. Architecting IT ]

Upload: alessandro-oliveira

Post on 21-Jun-2015

1.758 views

Category:

Technology


0 download

DESCRIPTION

Apresentação realizada em 05/12/2012 no JavaOneBrasil, com o Felipe Firmo pela Sensedia. O objetivo dessa palestra foi apresentar o trabalho em andamento sobre o tema REST para a publicação de APIs por clientes de grande porte.

TRANSCRIPT

Page 1: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com1

[ Empowering Business.Architecting IT ]

Page 2: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com2

REST: Patterns & Best Practices

Page 3: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com3

Quem somos nós

[email protected]@aro1976

[email protected]@felipe_firmo

Page 4: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com4

Público Alvo

API Designer

Arquiteto

ProgramadorGerente

Diretor

Page 5: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com5

Agenda

• Sobre a Sensedia• SOAP vs. REST• Elegibilidade de REST• Desafios de REST• Padrões e Melhores Práticas REST• Ferramentas• Q & A

Page 6: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com6

[ Sobre aSensedia ]

Nosso core é Arquitetura de TI:Serviços & Ferramentas.

Ajudamos empresas a seremMais Ágeis, Flexíveis e Inovadoras

Crescimento consistente:63% CAGR 2007-2011

Page 7: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com7

[ Sobre aSensedia ]

Profundo conhecimento em:√ SOA (Service Oriented Architechture)√ Governança√ Enterprise Architecture√ Cloud Computing

Page 8: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com8

Posicionado como Visionário no Quadrante Mágico do Gartner(1)

Criada a partir de iniciativa conjunta entre Ci&T e Laboratório de Inovação da Unicamp.

[ Sobre aSensedia ]

Page 9: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com9

Philadelphia, EUASão Paulo, BRCampinas, BR

Sede em Campinas, SP e escritórios em São Paulo, SP e Philadelphia, EUA

[ Sobre aSensedia ]

Page 10: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com10

[ Quem tem experimentadoa proposta de valor da Sensedia ]

Page 11: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com11

SOAP vs. REST

Page 12: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com12

SOAP vs. REST• SOAP: Simple Object Access Protocol• Baseado em XML• Padronizado pelo W3C• Soluções de diversos fabricantes• Compatibilidade com diversas linguagens e plataformas• Maior consumo de banda e complexidade na implementação• Contratos fortemente tipados• JSR 224: JavaTM API for XML-Based Web Services (JAX-WS) 2.0

Page 13: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com13

Exemplo de Requisição SOAPPOST /Stock HTTP/1.1Host: www.stockexchange.orgContent-Type: application/soap+xml; charset=utf-8Content-Length: 299SOAPAction: "http://www.w3.org/2003/05/soap-envelope" <?xml version="1.0"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> </soap:Header> <soap:Body> <m:GetStockPrice xmlns:m="http://www.stockexchange.org/stock"> <m:StockName>ORCL</m:StockName> </m:GetStockPrice> </soap:Body></soap:Envelope>

Page 14: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com14

SOAP vs. REST• REST: REpresentational State Transfer• É um estilo arquitetural, portanto, não necessariamente um

PADRÃO• Fortemente baseado na semantica do HTTP

Operações: GET, POST, PUT, PATCH, DELETE

• Virtualmente suportado por qualquer cliente HTTP Hypertext Transfer Protocol HTTP 1.1 - http://tools.ietf.org/html/rfc2616 PATCH Method for HTTP - http://tools.ietf.org/html/rfc5789

• Menor consumo de banda e overhead de processamento• Contratos Fracos

Page 15: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com15

Exemplo de uma requisição RESTGET /stocks?name=ORCL HTTP/1.1

Page 16: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com16

Desafios REST

Page 17: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com17

Desafios REST• Talvez o REST como um estilo arquitetural seja MUITO

ABSTRATO• Padronização é necessária? • Os designers de API podem utilizar diversas abordagens

para cada tema• Cada opção possui prós e contras, que precisam ser

ponderados durante a fase de design• A governança pode se tornar muito complexa

Page 18: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com18

Elegibilidade REST

Page 19: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com19

Elegibilidade REST vs. SOAPAspect SOAP REST

Público Alvo Interno/Parceiros Qualquer Um

Volume de Processamento Moderado Alto, com Picos

Transação Distribuida / Orquestração WS-* / BPEL Não Padronizado

Semântica de Consistência de Dados Comumente ACID Comumente Eventual

Contratos Fortemente Tipados Yes / WSDL / XSD WADL? / Não Padronizado

Segurança Basic / Digest / WS-Security

Basic / Digest / OAuth / OpenID

Ferramentas Automatizadas Bastante maduras Não são maduras

Suporte de Linguagens de Programação Boa Excelente

Interoperabilidade entre implementações Bastante maduras Não são maduras

Page 20: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com20

Padrões REST

Page 21: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com21

Grupos dos Padrões REST• Estratégia de

Implementação

• Segurança

• Formato de Dados

• Respostas Parciais

• Design

Page 22: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com22

• Construir tudo do zero• Reutilizar o legado

Estratégia de Implementação

Page 23: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com23

Construir Tudo do Zero• Cenário

Infraestrutura atual inexistente ou obsoleta

• Solução Criação de uma arquitetura de

referência Avaliar a utilização de diversos tipos de

banco de dados Utilização de cache distribuído Utilização de JMS para operações

assíncronas• Impactos

Necessária a avaliação de diversas opções

Análise de impacto de cada escolha

Page 24: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com25

Reutilizar o Legado• Cenário

Já existem sistemas que provem todas as informações a serem publicadas

• Solução Modificação da arquitetura de

referência atual para acomodar novos requisitos

Utilização de JMS para operações assíncronas

• Impactos Risco de sobrecarga nos sistemas

legados Menor flexibilidade no design da

solução Maior latência em consultas

Page 25: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com27

• Recurso Público• Autenticação no Recurso• Autenticação por Terceiros• Autorização pelo Recurso• Autorização Centralizada• Criptografia das Requisições/Respostas• Criptografia do Canal

Segurança

Page 26: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com28

Infraestrutura Elástica

Recurso Público• Cenário

Não existe necessidade de identificação de usuários

• Solução Publicar o recurso tal como ele é Definir mecanismos de

monitoramento• Impactos

Surtos de requisições Ataques de negação de serviço Provisionamento de Infraestrutura

Usuário Anônimo

Recurso

Monitoramento

Page 27: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com30

JavaEE Container

Autenticação no Recurso• Cenário

Restrição de acesso a um conjunto de usuários conhecidos

• Solução Utilizar uma base LDAP, SQL,

chave/valor Criptografia de senhas usando

algoritmos one-way usando salt• Impactos

Risco na proteção da base de senhas

Overhead na autenticação

Usuário Identificado

Recurso

LDAP

JAAS

Page 28: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com32

Autenticação por Terceiros• Cenário

Usuários não são conhecidos previamente pelo recurso

Informações de identidade são de propriedade de terceiros

• Solução Configurar autenticação utilizando

plataforma de terceiros, tais como:– Facebook– Twitter

• Impactos Dependência de fatores externos

Usuário Identificado

ResourceOwner

Facebook

Base de Usuários

Recurso API

Page 29: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com34

Segurançaautenticação por terceiros

Referência: https://developers.facebook.com/docs/concepts/login/login-architecture/

Page 30: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com35

• Versionamento de Recursos• Multiplos formatos

Formato de Dados

Page 31: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com36

Versionamento de Recursos• Cenário

É necessário fazer alterações incompatíveis no recurso

Não é possível assegurar a migração de todos os clientes ao mesmo tempo

• Solução Manter por um período determinado

mais de uma versão do recurso em operação

• Impactos Complexidade de Governança Aumento de custos de operação e

desenvolvimento

/pedidos

V 1.0 V 2.0

V 1.1

Page 32: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com38

Versão Única

Versionamento de Recursos• Nenhum Versionamento

Funciona como se o recurso estivesse sempre na versão 1

Impede a inclusão de novos atributos obrigatórios

Impede a retirada de atributos

Tende a deixar os recursos muito complexos

Ao longo do tempo pode ser insustentável

/pedidos

V 1.0

V 1.1

V 1.2

Page 33: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com39

Versionamento de Recursos• Versionamento na URI

Ex: http://api.sensedia.com/v1/pedidos Viola HATEOAS Fácil roteamento entre servidores Fácil manutenção de código Não requer a utilização de cabeçalhos

/pedidos

/v1/pedidos /v2/pedidos

Page 34: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com40

Versionamento de Recursos• Versionamento na Query String

Ex: http://api.sensedia.com/pedidos?_version=1 Viola HATEOAS Parâmetro é opcional ou obrigatório? Difícil manutenção de código Não requer a utilização de cabeçalhos

/pedidos

/pedidos?_version=1

/pedidos?_version=2

Page 35: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com41

Versionamento de Recursos• Versionamento no Media Type

Ex: http://api.sensedia.com/pedidos– Accepts: vnd.sensedia.com.pedidos+json; version=1

Dificulta a implementação de clientes Dificulta o acesso via browser (não deve ter versão default,

certo?) Moderada complexidade na manutenção de código

Page 36: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com42

Versionamento de Recursos

Nenhum URI Query String VND

Twitter até 2009 Twitter após 2009 Facebook Azure

Flickr Foursquare Google Data GitHub (v 3)

Dropbox Netflix *

GitHub (v 2) PayPal

Yammer EBay

Delicious

Last FM

Twillio

Page 37: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com43

Múltiplos Formatos• Cenário

Dependendo do recurso, talvez seja importante representá-lo de diversas formas.

• Solução Possibilitar que o cliente passe no

header Accept, o formato desejado. Prover diversas alternativas de

renderização dependendo do tipo do recurso

• Impactos Flexibilidade do uso pelos clientes Aumento de complexidade na

implementação

/pedidos/ABCD-1234

JSON XML

ICAL PDF

Page 38: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com45

• Paginação de Consultas• Subconjunto de Atributos

Respostas Parciais

Page 39: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com46

/pedidosPaginação de Consultas

• Cenário Os resultados de pesquisas são muito

grandes, sendo desnecessário ou inviável o acesso de uma única vez

Necessário a redução de custos de rede principalmente em mobile

• Solução Dividir o conjunto de recursos em

páginas minimizando o tamanho de cada requisição

• Impactos O sistema provedor das informações

precisa suportar paginação Necessário a utilização de caches para

consultas

Cliente

Página 2

Página 1

Página 3

Página 4

Page 40: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com48

Paginação de Consultas• Sem Paginação

Ex: http://api.sensedia.com/v1/pedidos Resultados potencialmente muito grandes Inviável para mobile Pode demandar muita infraestrutura de rede Simples para implementar, independente da estratégia de

implementação utilizada

Page 41: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com49

Paginação de Consultas• Paginação na URI

– Ex 1: http://api.sensedia.com/v1/pedidos/3/50» Página 3 com 50 registros

– Ex 2: http://api.sensedia.com/v1/pedidos/3» Página 3

– Confunde com a URI para acesso a um elemento do conjunto:

» http://api.sensedia.com/v1/pedidos/ABCD-12345

Page 42: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com50

Paginação de Consultas• Paginação na Query String

– Ex: http://api.sensedia.com/v1/pedidos?_pagina=3&_tamanho=50– Flexível pois o cliente pode ou não utilizar esse recurso– Pode definir o tamanho da página que é mais adequado para o consumo– Query String => Restrições– Opção recomendada para uso geral

Page 43: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com51

Paginação de Consultas: Cases Query String• Facebook

Offset Based– Limit– Offset

Time Based– Until– Since– Limit

Cursor Based– Limit– Before– After

• Twitter Time Based

– Until– Count

Cursor Based– Since_id– Max_id– Count

Referência: https://developers.facebook.com/docs/reference/api/pagination/https://dev.twitter.com/docs/api/1.1/get/search/tweets

Page 44: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com52

Paginação de Consultas• Paginação usando HTTP Headers

– Ex: http://api.sensedia.com/v1/pedidos– Requer uso do cabeçalho Range na requisição

» Range: pagina=3/50– Na resposta pode ser utilizado:

» Content-Range: pagina=3/50– Dificulta o uso no browser– Dificulta configuração HTTP Cache– Mantém a QueryString livre de metadados

Page 45: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com54

Subconjunto de AtributosExemplo Filtro Positivo: http://api.sensedia.com/v1/pedidos?_atributos=cliente,data,status,total[{

“cliente”: {“codigo”: “ABCD-1234”

},“data”:"2012-10-09T01:01:01","status": "AGUARDANDO_PAGAMENTO",“total”: 9.99

}]

Page 46: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com55

Subconjunto de AtributosExemplo Filtro Positivo: http://api.sensedia.com/v1/pedidos?_atributos=codigo,status[{

“codigo”: “ABCD-1234”,"status": "AGUARDANDO_PAGAMENTO”

},{

“codigo”: “EFGH-3456”,"status": ”ENTREGUE”

}]

Page 47: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com56

Subconjunto de AtributosExemplo Filtro Negativohttp://api.sensedia.com/v1/pedidos/4780-DEFG?_atributos=!itens{

“codigo”:”4780-DEFG”,“cliente”: {

“codigo”: “ABCD-1234”},“data”:"2012-10-09T01:01:01","status": "AGUARDANDO_PAGAMENTO",“total”: 9.99

}

Page 48: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com57

• Evitar refreshes desnecessários• Referências fracas entre recursos• Contrato Uniforme• Processamento Assíncrono

Design

Page 49: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com59

Evitar refreshes desnecessários• Cenário

Refreshes desnecessários podem impactar o potencial de escalabilidade da API

Recursos possuem diferences características quanto a volatilidade de dados

• Solução Identificar essas características de

volatilidade de dados Instrumentar os clientes e HTTP caches

• Impactos Maior esforço em tempo de design Maior esforço na implementação das

operações

GET /v1/pedidos/ABCD-1234 HTTP/1.1

Cache-Control: max-age=86400Etag: 69fafe9b{ “codigo”:”ABCD-1234”, ”status”:”AGUARDANDO_PAGAMENTO”}

Page 50: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com60

Volatilidade de Dados

Muito Estavel

Estavel

Estavel durante a sessão

Instável

Page 51: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com61

Volatilidade de Dados• Categorias

Alteração 1 vez ao mês Aceita até 1 semana de

defasagem• Produtos

Alteração 1 vez por semana Acetavel até 1 dia de

defasagem

• Clientes Alterações somente na

sessão Não há defasagem

• Pedidos Alterações frequentes Não é aceitavel defasagem

Page 52: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com62

Evitar Refreshes Desnecessários• Definir HTTP Headers (na resposta):

Last-Modified: http://tools.ietf.org/html/rfc2616#section-13.3.1 Cache-Control: http://tools.ietf.org/html/rfc2616#section-14.9 ETag: http://tools.ietf.org/html/rfc2616#section-13.3.2

Page 53: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com63

Referências fracas entre recursos• Cenário

Todos os recursos estão de certa forma associados

Não é possível manipular todos os recursos de uma só vez

• Solução Análise do modelo conceitual para

identificar as composições Agrupar as composições em um único

recurso Definir associação fraca entre recursos

• Impactos Possibilita a instrumentação de caches de

forma mais efetiva

Clientes Pedidos

ProdutosCategorias

Page 54: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com65

Referências fracas entre recursos

ReferênciasFortes

ReferênciasFracas

Page 55: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com66

Referências fracas entre recursosProduto:{

“codigo”:”ABCD-1234”,“descricao”:”…”,“preco”: 10.00,“categoria”: {“codigo”:”EFGH-5678”}

}

Categoria:{

“codigo”:”EFGH-5678”,“nome”:”smartphones”

}

Page 56: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com67

• /categorias• /categorias/{codigo}• /produtos• /produtos/{codigo}• /clientes• /clientes/{codigo}• /clientes/{codigo}/enderecos• /clientes/{codigo}/enderecos/{codigo}• /pedidos• /pedidos/{codigo}• /pedidos/{codigo}/itens• /pedidos/{codigo}/itens/{codigo}

Referências fracas entre recursos - URIs

Page 57: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com68

Contrato Uniforme• Cenário

A manipulação dos recursos devem se comportar de forma idêntica

• Solução Definir quais as operações HTTP serão aceitas Definir um cojunto de códigos de retorno de

sucesso e erro padronizados Revisar o comportamento de todos os

recursos• Impactos

Aumento no custo de desenvolvimento inicial Redução de complexidade no consumo dos

recursos

POST /pedidos HTTP/1.1

201 500

401 403

Page 58: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com69

200 OK: aceito para GET

201 Created: aceito para POST, indica que o recurso foi criado com sucesso, deverá existir o header Location: indicando a URI do novo recurso.

202 Accepted: aceito para POST, PUT, PATCH e DELETE, indica que o recurso criado representa um processo assíncrono, portanto, além do header Location, deverá retornar o conteúdo com um atributo status. Posteriormente o recurso poderá ser consultado para avaliar a alteração do status.

204 No Content: aceito para PUT, PATCH e DELETE

HTTP Status Codes – Casos de Sucesso

Page 59: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com70

• Exceção de negócio – retorna código 422;• Exceção do cliente – família 400:

400 - Requisição Mal Formada; 401 - Requisição Requer Autenticação; 403 - Requisição Negada; 404 - Recurso não Encontrado; 405 - Método não Permitido;

• Exceção do Servidor – retorna código 500;Além do código de retorno http, os detalhes do erro devem ser retornados no payload, com um link para a documentação do erro;

HTTP Status Codes – Casos de Erro

Page 60: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com71

Processamento Assíncrono• Cenário

As operações que modificam o estado, POST, PUT, PATCH e DELETE podem demorar, principalmente quando dependem do legado

• Solução Armazenar a requisição de forma imediata Retornar para o cliente com um ticket para

que ele possa consultar o status posteriormente

Notificação de alteração de estado• Impactos

Maior complexidade na implementação do cliente e do recurso

Page 61: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com72

Processamento Síncrono

Page 62: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com73

• São recursos que representam (ou iniciam) a execução de processos de longa duração.

• Na criação de um novo recurso, deverá retornar o código 202 – Requisição Aceita

• Eventuais erros de negócio deverão ser representados na forma de “status”, que poderão ser consultados de forma subsequente.

• Notificação de Fim de Trabalho: Dispositivos Móveis e Desktops: Polling Outros Sistemas: Notificação de Eventos

Recursos com Processamento Assíncrono

Page 63: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com74

Processamento Assíncrono - Polling

Page 64: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com75

Processamento Assíncrono - Callback

Page 65: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com76

Ferramentas

Page 66: REST: Padrões e Melhores Práticas

APIManager

PartnersPortal

APIGateway ESB

Business Application 1

Business Application 2

Engage Developers Manage API documentation,Access Keys and Usage

Control API Traffic

Developers

REST API Traffic

Publish

MonitoringPolicyDeploy

Web Browser

Internal Call

Get API Usage

Internal ServicesDiscovery

Partners Apps/ Commerce

Platforms

[ Componentes Tecnológicos ]

Page 67: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com78

Q & A

Page 68: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com79

Contatos

[email protected]@aro1976

[email protected]@felipe_firmo

Page 69: REST: Padrões e Melhores Práticas

© Copyright | www.sensedia.com80

[ Empowering Business.Architecting IT ]

Thank You!