REST
The right way
Quem sou?
Luís Santos - luis@luissantos.pt
Developer @ SAPO - Portugal Telecom
Rest: O que é?
Rest: O que é?
●
●
●
●

Representational state transfer
Arquitectura
Baseada em HTTP
Principios
○ Client-Server
○ Stateless
○ Cacheable
○ Layered System
Rest: Porquê?
Multiplataforma
●

Servidores
○

●

Todos os sistemas operativos e plataformas

Clientes
○

Todas as plataformas (incluindo p. moveis)
Segurança
● Confidencialidade dos dados
○ SSL
■ Destribuição de certificados

● Autenticação com certificados de cliente
Escalabilidade
● Escalabilidade horizontal
○ Proxys
○ Cache
○ Load Balancer
Recursos
Recursos
Elementos de informação ou “registos” que podem usados através do seu URI (uniform resource
identifier).

Exemplos:
/api/books/
/api/books/9780199535569/
/api/books/9780199535569/authors
/api/authors/
/api/authors/123/
Verbos HTTP
GET, POST, PUT, DELETE, HEAD,
OPTIONS, PATCH(?)
Verbos: GET
Obter informação sobre um recurso. Este verbo não afecta o estado do
recurso.

Verbo

endpoint

descrição

GET

/api/books/

Lista todos os livros

GET

/api/books/?limit=2&offset=10

Lista livros usando paginação

GET

/api/books/author=John doe

Pesquisa livros pelo nome do autor

GET

/api/books/9780199535569/

Detalhes de um livro
Verbos: GET
Pedido

Resposta
{
"total": 20,

GET /api/books/?limit=2&offset=10

"items": [
{
"isbn": "9780199535569",
"name": "Pride and Prejudice"
},
{
"isbn": "9780199535569",
"name": "Pride and Prejudice"
}
]
}
Verbos: GET
Pedido

Resposta
Http 1.1 200 OK

GET /api/books/9780199535569/

{
"isbn" : "9780199535569",
"name" : "Pride and Prejudice",
"publication_date" : "2009”
}
Verbos: POST
Cria um novo recurso.

Verbo
POST

endpoint
/api/books/

descrição
Adiciona um novo livro
Verbos: POST
Pedido

Resposta

POST /api/books/

Http 1.1 201 Created

{

{
"name" : "My Book"

"isbn" : "9999999999991",

}

"name" : "My Book"
}
Verbos: PUT
Modifica ou adiciona um recurso expecifico.

Verbo
PUT

endpoint
/api/books/9780199535569/

descrição
Altera ou adiciona o recurso
Verbos: PUT
Pedido

Resposta

PUT /api/books/9999999999991/

{

{

"name" : "My Book 2"
"name" : "My Book 2"

}

}
Verbos: DELETE
Apaga um recurso.

Verbo
DELETE

endpoint
/api/books/9780199535569/

descrição
Apaga o recurso
Verbos: DELETE
Pedido

Resposta

DELETE /api/books/9999999999991/

Status 200
Verbos: HEAD
Verifica se um recurso existe.

Verbo
HEAD

endpoint
/api/books/9780199535569/

descrição

Verifica se um recurso existe
Verbos: HEAD
Pedido

Resposta

HEAD /api/books/9780199535569/

Status 200
Verbos: PATCH
Modifica parcialmente um recurso.
http://www.rfc-editor.org/info/rfc5789 (Status: PROPOSED STANDARD)

Verbo
PATCH

endpoint
/api/books/9780199535569/

descrição
Altera apenas algumas propriedades do
recurso.
Verbos: PATCH
Pedido

Resposta

PATCH /api/books/9780199535569/

{

{

"name" : "My Book 2",
"publication_date" : "2008”

}

"publication_date" : "2008”
}
Verbos: OPTIONS
Obtem metada sobre o recurso.
HTTP Status
Code
1xx, 2xx , 3xx, 4xx, 5xx
Http Status Code
Http Status Code
● 2xx - Sucesso
● 4xx - Erro (Client side)
● 5xx - Erro (Server side)
Http Status Code : Exemplos
●
●
●
●
●
●

200 Ok
400 Bad Request
404 Not Found
401 Unauthorized
403 Forbidden
500 Internal Server Error
Error Handling
Error Handling
Error codes
●
●
●
●
●

Usar sempre um código HTTP adequado
Códigos de erro categorizados
Mensagem de erro
Link para a documentação
Identificador unico do pedido
○ Debug
Error codes
Certo
{

Errado
{

"error": 1345
"message" : "Invalid ISBN code"
"details" :"https://books.com/doc/errors/1345"
“id” : 12398231987312
}

"error": 1345
}
Cache
Cache
● Suporte para cache no protocolo
● Server Cache vs Client Cache
● Cache Headers
○ Cache-Control
○ Last-Modified
○ Etag
Cache: Client Cache (Cache-Control)
Cache: Client Cache (Last-Modified)
Cache: Client Cache (Etag)
Cache: Server Cache
Cache: Cache-Control
●

●

●

Cache-control: public
○ means the cached version can be saved by proxies and other
intermediate servers, where everyone can see it.
Cache-control: private
○ means the file is different for different users (such as their personal
homepage). The user’s private browser can cache it, but not public
proxies.
Cache-control: no-cache
○ means the file should not be cached. This is useful for things like
search results where the URL appears the same but the content may
change.
Autenticação
Autenticação
1.
●
●

2.

Utilização do header de autenticação. (Authorization)
Basic Authentication
○ Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Custom Authentication Scheme (Amazon AWS)
○ Authorization: AWS AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg=

Utilização de certificado de cliente (SSL)
Content Type
Content Type
● JSON
○ Performance
○ Simplicidade
○ Dynamic Language (PHP,JS)

● XML
○ More tools
○ More features
○ Static language (Java,C#)
Content Type
Certo
GET /api/books/9780199535569
Accept: application/json

Errado
GET /api/books/9780199535569.json
GET /api/books/9780199535569.xml

GET /api/books/9780199535569
Accept: application/xml
GET /api/books/9780199535569
Accept: application/epub+zip

GET /api/books/9780199535569?type=json
Versionamento
Versionamento
Certo
GET /api/v10/books/9780199535569

Errado
GET /api/books/9780199535569?v=10
GET /api/books/9780199535569
X-API-Version : 10
Concorrência
Concorrência
Problema:
2 clientes tentam modificar o recurso simultaneamente.
Como garantir que as alterações não se sobrepõem?
Solução:
Etag
Concorrência
WADL
Web Application Description Language
WADL
● “The Web Application Description Language
(WADL) is a machine-readable XML
description of HTTP-based web applications
(typically REST web services).” - Wikipedia
● Semelhante ao WSDL
WADL
<application xmlns="http://wadl.dev.java.net/2009/02">
<resources base="https://books.com/api">
<resource path="books">
<method name="GET">
<request>
<param name="limit" required="false" default="30" style="query"/>
<param name="offset" required="false" default="0" style="query"/>
</request>
</method>
<resource path="{isbn}">
<param required="true" style="template" name="isbn"/>
<method name="GET"/>
<method name="DELETE"/>
</resource>
</resource>
</resources>
</application>
Outros
● Compressão “out of the box”
○ Gzip
Hypermedia API
FIM

REST - The right way