JSON SCHEMA
VALIDE 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ÇÃO
MONOLITO 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
CASE GLOBO-CORE AT GLOBO.COM
▸ 40+ pessoas
▸ git merge hell
▸ Difícil fazer deploy
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 ?
VENHA TRABALHAR COM A GENTE
talentos.globo.com
OBRIGADO
▸ Github: wpjunior
▸ Outras redes sociais: about.me/
wpjunior

JSON Schema: Valide e navegue entre suas APIS