JSON SCHEMAVALIDE E NAVEGUE ENTRE SUAS APIS
WILSON JÚNIOR
ENGENHEIRO DE SOFTWARE NA GLOBO.COM HÁ QUASE 3 ANOS, MANTÉM PARTE DOS SERVIÇOS DE PUBLICAÇÃO DE CONTEÚDO, APAIXONADO POR MAIS DE UMA DÉCADA POR SOFTWARE E PESSOAS.
INTRODUÇÃOMONOLITO VS MICROSERVICES
O JEITO DE ARQUITETAR SOFTWARE MUDOU …
ERA UMA VEZ …
SOFTWARE MONOLITO
CARACTERÍSTICAS DE UM MONOLITO
▸ Codebase grande
▸ Toda regra de negocio
▸ Muitas pessoas mantendo
▸ Uma stack legada
▸ Alto culto de mudança
PARA RESOLVER ESSE PROBLEMA OS NOVOS MAGOS JOVENS CRIARAM UMA NOVA SOLUÇÃO …
MICRO SERVIÇOS
VANTAGENS DE UTILIZAR MICRO SERVIÇOS
▸ Única responsabilidade
▸ Pequenos times
▸ Rápido de escrever
▸ Stack independente
▸ Banco de dados isolado
EXEMPLO GLOBO.COM
AUTENTICAÇÃO API DE CONTEÚDOS
API DE VÍDEOS API SEMÂNTICA
CLIENTE RENDERIZADOR DE CONTEÚDO
ADMIN SPA
COMO OS SERVIÇOS SE INTERAGEM
▸ HTTP - Restful
▸ JSON
▸ N Clients
CONSEQUÊNCIA DE VÁRIAS APIS
CONSEQUÊNCIA DE VÁRIAS APIS
▸ Muitos contratos para manter
▸ Muita documentação
▸ Validação
▸ Descobrir os endereços
▸ Lidar com breaking changes
▸ Difícil navegação
JSON SCHEMA!
VANTAGENS
▸ Descreve o formato dos dados
▸ limpa para leitura de máquinas e humanos
▸ Completa estrutura de validação
EXEMPLO
{ "id": 1000501, "name": "Wilson Júnior", "city": { "name": "Rio de Janeiro", "state": "RJ" }, "age": 24 }
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Pessoa", "type": "object", "properties": { "id": { "type": "number", "title": "Identifier" }, "name": { "type": "string", "minLength": 3, "title": "Person name" }, "city": { "title": "City", "type": "object", "description": "Where person lives", "properties": { "name": { "type": "string", "title": "Name"}, "state": { "type": "string", "title": "State", "enum": ["RJ", "SP", "GO"]} } }, "age": { "type": "number" } }, "required": ["name", "city"] }
CONSEQUÊNCIA VALIDAÇÃO CLIENT-SIDE E SERVER-SIDE
JÁ PODEMOS VALIDAR, O QUE MAIS FALTA …
NAVEGAR ENTRE AS APIS
JSON HYPER-SCHEMA
▸ Descreve a sua API
▸ Descreve links
▸ Descreve formulários
EXEMPLO{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Pessoa", "type": "object", ... "links": [ { "rel": "photos", "href": “http://my-photo-service/by-person/{id}“ } ] }
TEXT
EXEMPLO (MANUTENABILIDADE){ "$schema": "http://json-schema.org/draft-04/schema#", "title": "Pessoa", "type": "object", ... "links": [ { "rel": "photos", "href": “http://my-photo-v2/photos/{id}“ }, { "rel": "delete", "href": "/api/person/{id}", "method": "DELETE" } ] }
COMO EU AMARRO UM SCHEMA A UM RECURSO DENTRO DE UMA API RESTFUL
curl -i http://myapi.com/people/1000501 HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8; profile=“http://myapi.com/schemas/people”
{“id”: “xpto”, …}
FERRAMENTAS
VALIDAÇÕES
▸ Python: github.com/Julian/jsonschema
▸ GO: github.com/xeipuuv/gojsonschema
▸ Ruby: github.com/ruby-json-schema/json-schema
▸ Javascript: geraintluff.github.io/tv4/
▸ Mais em: json-schema.org/implementations.html
TEXT
PLUCT
github.com/globocom/pluct
import pluct
# Load a resource item = pluct.resource('http://myapi.com/people/1000501') photos = item.rel('photos', params={'q': 'Roupa bonita'})
TECNOLOGIAS ALTERNATIVAS/RELACIONADAS
▸ GRPC
▸ JSON-LD
▸ GraphQL
GOSTOU DA TECNOLOGIA ?