restful apis com spring 3
DESCRIPTION
Apresentação feita no SerraStartec 2013 em Lages/SC 05/10/2013. O objetivo foi uma introdução as REST webservices utilizando o Spring.TRANSCRIPT
Globalcode – Open4education
Restful APIs com Spring 3
Globalcode – Open4education
Restful APIs com Spring 3
Alex MirandaSoftware Engineer
Guilherme BrancoSoftware Engineer
Globalcode – Open4education
REpresentational State Transfer
● Comunicação Cliente - Servidor● Estilo Arquitetural● Termo cunhado por Roy Fielding em 2000● Interface web simples que utiliza diversos formatos de
dados, sem abstrações adicionais● Ênfase nos recursos e sem estado
Globalcode – Open4education
Porque REST?● Simples, leve e escalável● Orientado a recursos● Sem estado, cada requisição contém toda informação
necessária● Utiliza todo o poder da Web – Restful● Fácil de começar a desenvolver uma aplicação que
conecte inúmeros clientes● Suporta diversas plataformas, dispositivos ou tipos de
clientes
Globalcode – Open4education
Porque Spring?● Plataforma completa para desenvolvimento de
aplicações em Java, groovy ou outras linguagens que rodam na JVM
● Facilitou o desenvolvimento de aplicações enterprise● Permite que o desenvolvedor foque no negócio● Um dos frameworks mais populares e com comunidade
ativa● Open-source● Spring MVC Test framework
Globalcode – Open4education
Princípios do REST
● Expõe recursos logicamente organizados como uma estrutura de um sistema de arquivos, fácil de ser entendido
● O cliente acessa representações de um estado do recurso
● As mensagens utilizam métodos HTTP padrões (GET, POST, PUT e DELETE)
● O servidor é sem estado, ficando a cargo do cliente manter estado entre requisições ao servidor
● Utiliza hipermedia tanto para representação de estados, como para transições deste estado
Globalcode – Open4education
Conceito de Recursos
● É tudo aquilo que o seu sistema expõe
● Tudo é um recurso○ Usuários, assinatura, autenticação, carrinho de
compra, contagem de uma produtos…
● Deve ser independente de sua representação○ /api/users/1001.html○ /api/users/1001.json○ /api/users/1001 [Accept: application/xml]
Globalcode – Open4education
GET
● Seguro● Idempotente
● Aceita headers como○ Accept○ If-None-Match
● Responde com○ 200, 304 ou 404…○ Content-Type○ Content-Length○ ETag
Globalcode – Open4education
GET
Globalcode – Open4education
GET - Exemplo
URI: /api/games/1METHOD: GetHEADERS:
Accept: application/json
Status Code: 200 OKHEADERS:
Content-Type: application/jsonContent-Length: 199 bytes
Globalcode – Open4education
GET - Exemplo
URI: /api/games/1METHOD: GetHEADERS:
Accept: application/json
Status Code: 404 NOT FOUND
Globalcode – Open4education
GET - Exemplo
URI: /api/games/1METHOD: GetHEADERS:
Accept: application/json
Status Code: 304 MovedHEADERS:
Location: /api/archivedGames/1
Globalcode – Open4education
PUT
● Idempotente
● Aceita headers como○ Accept○ If-Match
● Responde com○ 200, 202, 400, 404, 409, 500…○ Content-Type○ Content-Length○ ETag
Globalcode – Open4education
PUT
Globalcode – Open4education
PUT - Exemplo
URI: /api/games/1METHOD: PutHEADERS:
Accept: application/jsonContent: { status: ‘OVER’ }
Status Code: 200 OK
Globalcode – Open4education
PUT - Exemplo
URI: /api/games/1METHOD: PutHEADERS:
Accept: application/jsonContent: { status: ‘INVALID’ }
Status Code: 400 BAD REQUESTContent: { status: 400, reason: “invalid data” }
Globalcode – Open4education
DELETE
● Pode ser assíncrono● Não aceita Message Body● Não aceita Response Body *
● Aceita headers como○ Accept
● Responde com○ 200, 202, 404, 409, 500…
Globalcode – Open4education
DELETE
Globalcode – Open4education
DELETE - Exemplo
URI: /api/games/1METHOD: Delete
Status Code: 200 OK
* Side-effect
Globalcode – Open4education
DELETE - Exemplo
URI: /api/games/1METHOD: Delete
Status Code: 202 ACCEPTED
Globalcode – Open4education
DELETE - Exemplo
URI: /api/games/1METHOD: Delete
Status Code: 301 MOVED PERMANENTLY 302 MOVED
HEADERS:Location: /api/archivedGames/1
Globalcode – Open4education
POST● Criar um recurso no servidor● Enviar uma mensagem contendo
uma requisição para uma operação
● Aceita headers como○ Accept
● Responde com○ 200, 202, 400, 500…○ Content-Type○ Content-Length○ Location○ ETag
Globalcode – Open4education
POST
Globalcode – Open4education
POST - Exemplo
URI: /api/gamesMETHOD: PostHEADERS:
Accept: application/json
Status Code: 201 CREATED
HEADERS:Location: /api/games/3 *
CR
IA U
M N
OV
O J
OG
O V
AZI
O
Globalcode – Open4education
POST - Exemplo
URI: /api/games/3METHOD: PostHEADERS:
Accept: application/jsonContent Type: application/json
Content: { mark: ‘X’, position: ‘TopLeftCorner’ }
Status Code: 200 CREATED * E
NV
IA J
OG
AD
A P
AR
A S
ER
VID
OR
Globalcode – Open4education
HIPERMEDIA
● Páginas da Web● Diversos formatos● Permite descobrir
operações disponíveis
Globalcode – Open4education
Modelo de Maturidade
http://martinfowler.com/articles/richardsonMaturityModel.html
Globalcode – Open4education
HATEOAS
● Hypermedia As The Engine Of Application State● A interação do cliente com servidor se dá através
de hypermedia● A lista de links de um recurso deve ser dinâmica e
refletir cada estado possível● Diálogo entre cliente e servidor● Desacopla cliente e servidor, permitindo que a API
evolua independente
Globalcode – Open4education
Jogo-da-velha
Globalcode – Open4education
Spring MVC
● Centrado em um servlet que dispacha as requisições - FrontController;
● DispatcherServlet;
● Integrado com o container IoC do Spring;
Globalcode – Open4education
Spring MVC
Get - api/games/1
Mapeamento no controller - api/games
Post - api/games/1
Globalcode – Open4education
Spring HATEOAS
● Fornece APIs que facilitam a criação das representações e links;
● Criação de links com base em métodos do Controller
Globalcode – Open4education
Spring HATEOAS
● ResourceSupport, ResourceAssemblerSupport
Globalcode – Open4education
Spring MVC Test
● Suporte para testes de client e server-side
● Requisições utilizando o DispatcherServlet
● API fluente para os asserts
Globalcode – Open4education
Spring MVC Test
Globalcode – Open4education
Spring MVC Test
Globalcode – Open4education
DEMO
1. Projeto2. Rest shell3. Aplicação HTML5 + JavaScript
Globalcode – Open4education
Erros clássicos
● Expor estritamente todas as entidades do modelo● Achar que todas as “ações” devem ser
implementadas para todos os recursos● Adicionar “métodos” que não se encaixam com os
Verbos HTTP, ou métodos padrões
Globalcode – Open4education
Perguntas?
Globalcode – Open4education
Obrigado
br.linkedin.com/pub/guilherme-branco/26/775/2a4
github.com/gpbranco
twitter.com/guipbranco
br.linkedin.com/in/mmirandaalex
github.com/alexmiranda
twitter.com/mmalx
alexmiranda.net
https://github.com/alexmiranda/tic-tac-toe-restful
Alex MirandaSoftware Engineer
Guilherme BrancoSoftware Engineer