1 REST Caio Nakashima [email protected] [email protected].

25
1 REST Caio Nakashima [email protected] [email protected]

Transcript of 1 REST Caio Nakashima [email protected] [email protected].

Page 1: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

1

REST

Caio Nakashima

[email protected]

[email protected]

Page 2: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

RESTful

• REpresentation State Transfer• Estilo de arquitetura de software para sistemas

distribuídos• Termo proposto por Roy Fielding em sua tese de

doutorado• http://www.ics.uci.edu/~fielding/pubs/dissertation/top

.htm• Web services com a arquitetura da internet• Exploração extensa dos recursos do HTTP

Page 3: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Definição

• REST é um conjunto de princípios que definem como Web Standards como HTTP e URIs devem ser usados (o que freqüentemente difere um pouco do que muitas pessoas atualmente fazem). A promessa é que se você aderir a princípios REST enquanto estiver desenhando sua aplicação, você terá um sistema que explora a arquitetura da Web em seu benefício.

Page 4: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Princípios fundamentais

• Dê a todas as coisas um Identificador• Vincule as coisas• Utilize métodos padronizados• Recursos com múltiplas representações• Comunique sem estado

Page 5: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Dê a todas as "coisas" um ID

• Tudo o que deveria ser identificado deveria obviamente ter um ID – Na Web, há um conceito unificado para IDs: A URI.

• URIs compõe um namespace global,e utilizando URIs para identificar seus recursos chave significa ter um ID único e global.

• http://example.com/customers/1234 http://example.com/orders/2007/10/776654 http://example.com/products/4554 http://example.com/processes/salary-increase-234

Page 6: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Vincule as coisas

<order self="http://example.com/customers/1234"><amount>23</amount> <product ref="http://example.com/products/4554"></product><customer ref="http://example.com/customers/1234"></customer> </order>

Os links podem apontar para recursos que são oferecidos por uma aplicação diferente, um outro servidor, ou até mesmo em uma empresa diferente em outro continente - porque o esquema de nomes é um padrão global, todos os recursos que compõe a Web podem ser ligados uns aos outros.

Page 7: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

• O fato de que o servidor (ou provedor de serviços, se você preferir) oferece um conjunto de links para o cliente (o consumidor do serviço), permite ao cliente mudar o aplicativo de um estado para outro, através de um link.

• Use liks para referênciar coisas que possam ser identificadas (recursos) sempre que for possível. Hiperlinks são o que fazem a Web ser a Web.

Page 8: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Utilize os métodos padrão

• O HTTP chama verbos, e além dos dois que todo mundo conhece (o GET e o POST), o conjunto de métodos padrão inclui PUT, DELETE, HEAD e OPTIONS.

• O significado de cada um desses métodos é definido na especificação do HTTP, juntamente com algumas garantias sobre o seus comportamentos.

• Um desenvolvedor OO pode imaginar que todo recurso em um cenário HTTP RESTful estende uma classe como essa (em alguma pseudo-sintaxe no estilo Java/C# concentrando-se nos métodos principais):

Page 9: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Exemplo

class Resource { Resource(URI u); Response get(); Response post(Request r); Response put(Request r); Response delete();

}Como a semântica do GET é definida na especificação, você pode ter certeza que tem obrigações quando chamá-lo - é por isso que o método é chamado de "seguro". O GET suporta caching de forma muito eficiente e sofisticada, em muitos casos, você nem sequer precisa enviar uma requisição ao servidor.

Page 10: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

• Se você expuser as funcionalidades do seu aplicativo (ou funcionalidades do serviço, ser você preferir) do modo RESTful, esse princípio e suas restrições se aplicam a você também.

• Isso é difícil de aceitar se você estiver acostumado com uma abordagem de design diferente - afinal, você esta provavelmente convencido de que seu aplicativo tem muito mais lógica do que é expressado com operações manuais.

Page 11: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.
Page 12: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.
Page 13: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

• A interface uniforme também permite que qualquer componente que entenda o protocolo de aplicação HTTP interaja com seu aplicativo.

• Exemplos de componentes que são beneficiados por isso são clientes genéricos como o curl, o wget, proxies, caches, servidores HTTP, gateways e até mesmo o Google, o Yahoo!, o MSN e muitos outros.

• Para que clientes possam interagir com seus recursos, eles devem implementar o protocolo de aplicação padrão (HTTP) corretamente, isto é, utilizar os métodos padrão: GET, PUT, POST e DELETE.

Page 14: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Recursos com múltiplas representações

• Como é que um cliente saberá como lidar com os dados que obtém, por exemplo, como resultado de uma requisição GET ou POST?

• A abordagem do HTTP permite uma separação entre as responsabilidades de manipulação de dados e invocação de operações.

• Em outras palavras, um cliente que sabe como lidar com um formato específico de dados pode interagir com todos os recursos que possam oferecer uma representação nesse formato.

• Utilizando a negociação de conteúdo HTTP, um cliente pode solicitar por uma representação em um formato específico:

Page 15: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

GET /customers/1234 HTTP/1.1Host: example.com Accept: application/vnd.mycompany.customer+xml

O resultado pode ser um XML em algum formato específico de um empresa que representa os dados de um cliente. 

GET /customers/1234 HTTP/1.1 Host: example.com Accept: text/x-vcardO resultado poderia ser o endereço de um cliente no

formato vCard.

Page 16: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Comunique sem Estado

• E importante salientar que embora REST inclua a ídeia de "não manter", isso não significa que o aplicativo que exponha suas funcionalidades não possa ter estado - de fato, isso tornaria a abordagem inútil na maioria dos cenários.

• REST exige que o estado seja transformado no estado do recurso ou mantido no cliente.

• Em outras palavras, um servidor não deveria guardar o estado da comunicação de qualquer um dos clientes que se comunique com ele além de uma única requisição.

• A razão mais óbvia para isso é escalabilidade - o número de clientes que podem interagir com o servidor seria consideravelmente impactado se fosse preciso manter o estado do cliente.

Page 17: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Origem

• Roy Fielding é um dos principais autores do protocolo HTTP, e ele propôs em sua tese de doutorado um estilo de arquitetura que faz extenso uso dos recursos oferecidos por este protocolo.

• Enquanto nos serviços WS os recursos do HTTP são muito pouco explorados (inclusive porque o SOAP é independente de transporte), nos serviços REST umas das principais características é a utilização de muitos recursos do HTTP para elaborar um protocolo de comunicação conciso e claro.

Page 18: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Por que implementar serviços REST

• Protocolos menos complexos• Mais poder e flexibilidade nas comunicações• Arquitetura amplamente disponível nas empresas• Menos overhead de protocolo

• Pontos negativos• Integrações com produtos fechados WS-*• Quando WS-Transaction fizer sentido• Quando WS-Security fizer sentido• Quando não houver API HTTP razoável no servidor

e/ou clientes-alvo

Page 19: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

REST / TCP/IP / WS

• WS-I– Muitas especificações antes das implementações– Muitos documentos e complexidade para definir as

implementações– Modelo semelhante a waterfall/cascata.

• REST– Conjunto de regras simples– Especificações criadas após uso maduro– Especificações por grupos de estudo do IETF– Modelo incremental de desenvolvimento de padrões /

boas práticas.

Page 20: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Arquitetura

• A arquitetura dos web services WS-* se baseia em um protocolo bem definido, com regras precisas quanto ao formato dos dados trafegados e seguindo padrões acordados em consórcios de grandes corporações. Contrastando com isso, arquitetura dos web services REST é radicalmente diferente.

Page 21: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Diferenças

• WS-*: “Já temos o protocolo e os padrões, devemos definir os serviços que vamos oferecer e os documentos que desejamos trocar entre as partes.”

• REST: “Vamos identificar os recursos envolvidos e utilizar extensamente os recursos do HTTP para definir um bom protocolo de interação com estes recursos.”

Page 22: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

Estilo Declarativo x Imperativo

• REST: Clientes interagem com os Recursos através de requisições HTTP GET, PUT, POST e DELETE

• WS-*: Clientes invocam diferentes operações, com conjuntos variados de parâmetros de entrada e saída

Page 23: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

• A URI deve indicar o que se está manipulando e o método (ou verbo) HTTP indicará como você está manipulando.

• A URI /usuario/123456 nos indica que estamos manipulando um usuário específico.

• Sabendo que estamos usando o método HTTP GET, temos a clara indicação de que estamos buscando os dados deste usuário.

• Este estilo de invocação de serviços pode ser considerado Declarativo.

Page 24: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.
Page 25: 1 REST Caio Nakashima caio.nakashima@mds.gov.br caionakashima@gmail.com.

• Nos web services WS-*, a informação da operação que está sendo realizada fica encapsulada no corpo da requisição.

• Mesmo quando a camada de transporte das mensagens SOAP é HTTP, a URI não esclarece de forma alguma a operação envolvida.

• A informação dos serviços disponíveis fica descrita por elementos operation de um documento WSDL, geralmente em um formato fazerEssaOperacao.

• Esta maneira de desenvolver web services é classificada como Imperativa.