Minha API deve ser REST? MANDIC + RIVENDEL. ESPECIALISTAS … · 2018-12-14 · 23 GraphQL + Criado...

Post on 02-Apr-2020

3 views 0 download

Transcript of Minha API deve ser REST? MANDIC + RIVENDEL. ESPECIALISTAS … · 2018-12-14 · 23 GraphQL + Criado...

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

22

https://graphql.org/

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

32

https://netflix.github.io/falcor/

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] }

},

{...}

]

}

38

https://grpc.io/

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)

40

https://grpc.io/

41

https://grpc.io/

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

56

https://github.com/GuiaBolso/events-protocol

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!