1
MANDIC + RIVENDEL. ESPECIALISTAS EM CLOUDS.
Minha API deve ser REST?
2
Engenheira de Dados
@alanepontes
Alane Pontes
3
Engenheiro de Software
@ezidio
Everton Tavares
4
Histórico
5
Criado por Roy Fielding, um dos principais criadores do HTTPhttps://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
6
Rest disponibiliza recursos através de padronização de URIs*
*Uniform Resource Identifier
7
Rest é o uso de todo potencial do HTTP
8
Rest x SOAP
9
Rest x SOAP
10
Rest x SOAP
11
Rest é, na maioria das vezes, a primeira escolha para criação de API’s
12
Rest é fácil
13
Rest é comum
14
Existem vários frameworks para trabalhar com Rest
15
Rest tem suas limitações
16
Over-fetching
17
Under-fetching
18
19
/sports/sports/1/sports/1/competitions/sports_with_competitions/sports_with_competitions_but_only_abbreviation
20
Rest é bom para todos os contextos?
21
Alternativas ao Rest
23
GraphQL
+ Criado pelo Facebook+ Não é um protocolo+ Não é um Data Interchange Format+ Focado em grafos+ Permite definir os campos que deseja retornar na consulta+ Separa consultas e mutações+ Permite mais de uma consulta em uma única requisição.+ Consulta definida no body de uma mensagem POST
24
GraphQL
+ Fortemente tipado+ Declativo+ Hierarchical+ Não pertence a uma linguagem especifica+ compatível com qualquer backend
25
GraphQL
type Query { products: [Product] product(id:Int): [Product]}type Product { id: Int name: String tags: [String] price: Float category: Category}type Category { name: String}
{ products: { id name price category: { name } }}
26
GraphQL
type Query { products: [Product] product(id:Int): [Product]}type Product { id: Int name: String tags: [String] price: Double category: Category}type Category { name: String}
{ products: [ { “id”: 1, “name”: “Relogio Casio”, “price”: 270.4, “category”: { “name”: “Relogio” } }, { … } ]}
27
GraphQL
type Query { products: [Product] product(id:Int): [Product]}type Product { id: Int name: String tags: [String] price: Double category: Category}type Category { name: String}
{ product(id = 2): { id name }}
28
GraphQL
type Query { products: [Product] product(id:Int): [Product]}type Product { id: Int name: String tags: [String] price: Double category: Category}type Category { name: String}
{ product: { “id”: 1, “name”: “Relogio Casio” }}
29
GraphQL - Mutations
type Mutation { update(id:Int, name:String): Product delete(id:Int): Boolean}
mutation { update(id: 2, name: “Teste”): { id name } delete(id: 5)}
30
Rest x SOAP
31
Rest x GraphQL
GRAPHQL
33
Falcor
+ Criado pela Netflix+ Focado em grafos+ Permite definir os campos que deseja retornar na consulta+ Somente consultas+ Tipagem fraca+ Possui diversos tipos de providers+ Usar Falcor é como acessar um JSON diretamente.
http://netflix.github.io/falcor/
34
var model = new falcor.Model({
source: new HttpDataSource(baseUrl + '/model.json')
});
var jsonGraph = await model.get(["products", {from: 0, to:10},
["id","name","price"]]);
Falcor
35
/GET?paths=[“products[0..10][‘id’,’name’,’price’]”]{ products: [ { “id”: 1, “name”: “Relogio Casio”, “price”: 270.4 }, { … } ]}
Falcor
36
Falcor
{
categoryById: {
"10": {
product: "Relogios",
done: false,
prerequisites: [{ $type: "ref", value: ["todosById", 54] }]
}, {...}
},
categories: [{ $type: "ref", value: ["categoryById", 10] }, { ... }],
37
Falcor
products: [
{
id: 1
name: "Relogio Casio",
price: 270.4
category: { $type: "ref", value: ["categoryById", 10] }
},
{...}
]
}
39
gRPC
+ Criado pelo Google+ RPC - Remote Procedure Call+ Usa Protocol Buffers & Flat Buffers (Data Interchange Format)+ Simple service defination+ Usa HTTP/2+ Disponível para diversas linguagens (Java, PHP, C++, Go, JavaScript, Ruby,
Python, C#, Objective-C, Android/Java e Dart)
42
gRPC
service ProductService { rpc getProduct (ProductRequest) returns (Product) {}}message ProductRequest { int32 id = 1;}message ProductReply { int32 id = 1; string name = 2; double price = 3;}
43
44
C#
GoPython
45
Um pouco mais sobre o Protocol Buffers
46
Protocol Buffer
+ Garantia de type-safety+ Prevenção de violações de schema+ É gerado simples acessores+ Fast serialização/desserialização
47
Protocol Buffers vs JSON - Deserialização
48
Protocol Buffers vs JSON - Tamanho da Mensagem
49
Flat Buffer
50
Flat Buffer
+ tem mais opções de schemas.+ é indicado para um grande conjunto de dados.+ não desserializa todo o dado até que você o use.
51
Flat buffer vs Protocol Buffers vs Json
52
Outros protocolos
+ WebSocket+ SOAP+ ...
53
Economia
200 Milhões
54
Criar seu próprio protocolo
55
Protocolo próprio
+ Nem sempre é reinventar a roda+ Regra de negócio pode exigir isso+ Arquitetura pode exigir isso
57
Alternativas ao JSON
58
O padrão Rest não obriga utilizar o JSON
59
Alternativas
+ YAML+ XML+ Binary JSON+ Protocol Buffer+ FlatBuffers+ Etc...
Concluindo...
61
Rest é excelente
62
Contexto pode exigir alternativas
63
64
Obrigado!
Top Related