Upload
santosluis87
View
387
Download
1
Tags:
Embed Size (px)
Citation preview
RESTThe right way
Quem sou?
Luís Santos - [email protected] @ 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
RecursosElementos 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 HTTPGET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH(?)
Verbos: GETObter 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: GETPedido
GET /api/books/?limit=2&offset=10
Resposta{
"total": 20,
"items": [
{
"isbn": "9780199535569",
"name": "Pride and Prejudice"
},
{
"isbn": "9780199535569",
"name": "Pride and Prejudice"
}
]
}
Verbos: GETPedido
GET /api/books/9780199535569/
RespostaHttp 1.1 200 OK{ "isbn" : "9780199535569", "name" : "Pride and Prejudice", "publication_date" : "2009” }
Verbos: POSTCria um novo recurso.
Verbo endpoint descrição
POST /api/books/ Adiciona um novo livro
Verbos: POSTPedido
POST /api/books/
{ "name" : "My Book" }
Resposta
Http 1.1 201 Created{ "isbn" : "9999999999991", "name" : "My Book" }
Verbos: PUTModifica ou adiciona um recurso expecifico.
Verbo endpoint descrição
PUT /api/books/9780199535569/ Altera ou adiciona o recurso
Verbos: PUTPedido
PUT /api/books/9999999999991/
{ "name" : "My Book 2" }
Resposta
{ "name" : "My Book 2" }
Verbos: DELETEApaga um recurso.
Verbo endpoint descrição
DELETE /api/books/9780199535569/ Apaga o recurso
Verbos: DELETEPedido
DELETE /api/books/9999999999991/
Resposta
Status 200
Verbos: HEADVerifica se um recurso existe.
Verbo endpoint descrição
HEAD /api/books/9780199535569/ Verifica se um recurso existe
Verbos: HEADPedido
HEAD /api/books/9780199535569/
Resposta
Status 200
Verbos: PATCHModifica parcialmente um recurso. http://www.rfc-editor.org/info/rfc5789 (Status: PROPOSED STANDARD)
Verbo endpoint descrição
PATCH /api/books/9780199535569/ Altera apenas algumas propriedades do recurso.
Verbos: PATCHPedido
PATCH /api/books/9780199535569/
{ "publication_date" : "2008” }
Resposta
{ "name" : "My Book 2", "publication_date" : "2008”}
Verbos: OPTIONS
Obtem metada sobre o recurso.
HTTP Status Code1xx, 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{ "error": 1345 "message" : "Invalid ISBN code" "details" :"https://books.com/doc/errors/1345" “id” : 12398231987312}
Errado{ "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ção1. Utilização do header de autenticação. (Authorization)
● Basic Authentication○ Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
● Custom Authentication Scheme (Amazon AWS)○ Authorization: AWS AKIAIOSFODNN7EXAMPLE:frJIUN8DYpKDtOLCwo//yllqDzg=
2. 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 ErradoGET /api/books/9780199535569.json
GET /api/books/9780199535569.xml
GET /api/books/9780199535569?type=json
GET /api/books/9780199535569Accept: application/json
GET /api/books/9780199535569Accept: application/xml
GET /api/books/9780199535569Accept: application/epub+zip
Versionamento
Versionamento
Certo ErradoGET /api/v10/books/9780199535569 GET /api/books/9780199535569?v=10
GET /api/books/9780199535569X-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
WADLWeb 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