Ir para o conteúdo

Recomendações da API REST

Visão Geral

Este documento fornece orientação para desenvolvedores que desejam implementar uma API REST compatível com Vinyl.

Para os fins deste documento, assumiremos que o desenvolvedor está focado na criação de um serviço CRUD REST. Muitos dos princípios usados em uma API CRUD serão aplicáveis a outras APIs. No entanto, uma API CRUD provavelmente terá os requisitos mais abrangentes que irão interagir com o Vinyl (paginação, pesquisa, filtragem, etc.).

Princípios de Design RESTful

Na medida do possível, a API REST do Vinyl segue estes princípios RESTful:

  • Os serviços são apátridas.
  • Os Endpoints são modelados como recursos.
  • As operações GET são seguras. Uma operação “segura” é aquela que não apresenta efeitos colaterais. Por exemplo, recuperar uma lista de clientes não altera a lista de clientes.
  • As operações DELETE não são seguras, mas são idempotentes. No entanto, enquanto a primeira solicitação (bem-sucedida) para excluir um item retornará um código de status 200, a segunda solicitação retornará um 404.
  • As operações POST não são seguras nem idempotentes. Por causa disso, as operações POST podem conter dados parciais.
  • Os códigos de status HTTP indicam se ocorreu um erro.
  • Os tipos de mídia são usados para realizar a negociação de conteúdo. No momento, porém, o Vinyl suporta apenas JSON (application/json) e UTF-8.

O Vinyl não adere a todos os princípios RESTful:

  • Os órgãos de solicitação e resposta de recursos são embrulhados em um envelope. Isso permite que o Vinyl inclua informações adicionais, como mensagens de eventos e resultados de validação.
  • As respostas dos recursos não são hipermídia: não incluem links para outros recursos.

Envelope

Os corpos de solicitação e resposta da API REST do Vinil são embalados em um envelope. Os envelopes permitem que os dados sejam enviados de e para um endpoint da API fora da payload do endpoint.

Solicitar Envelope Corporal

O corpo da solicitação da API REST do Vinil contém estas propriedades de envelope:

Nome da propriedade Descrição
item A payload do endpoint.

Exemplo JSON

{
  "item": {}
}

Envelope Corporal de Resposta

O corpo da resposta da API REST do Vinil contém estas propriedades de envelope:

Nome da propriedade Descrição
mensagem A mensagem de sucesso ou falha do evento.
status Este é o código de status HTTP (duplicado).
validações Uma matriz de erros/avisos de validação para o endpoint chamado.
item ou itens A payload do endpoint – um único item ou uma coleção de itens.

Exemplo JSON

{
  "message": "",
  "status": 200,
  "validations": [],
  "items": []
}

Validações

Quando erros são encontrados, um objeto de validação é adicionado à matriz de validações no envelope de resposta. O objeto de validação possui as seguintes propriedades:

Nome da propriedade Descrição
mensagem A mensagem de validação.
severidade A gravidade da validação:
  • error
  • warning
  • information
campo O campo referenciado pela validação.

Exemplo JSON

{
  "message": "",
  "status": 400,
  "validations": [
    {
      "message": "CustomerId is mandatory.",
      "severity": "error",
      "field": "customerId"
    },
    {
      "message": "CompanyName is mandatory.",
      "severity": "error",
      "field": "companyName"
    }
  ],
}

Operações Principais

Estas são as operações básicas que o seu serviço REST deve suportar. É claro que alguns serviços optarão por não implementar determinados métodos (por exemplo, um serviço somente leitura implementaria apenas métodos Get Single/Get Many).

Fique Solteiro

A operação Get Single retorna um único registro. O identificador do registro é especificado na URL.

Método HTTP

PEGAR

URL de Exemplo

https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1

Exemplo JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
}

Obtenha Muitos

A operação Get Many retorna muitos registros para uma coleção. Muitas vezes, esta operação é usada junto com a paginação, para permitir a leitura de uma coleção de registros.

Se possível, uma contagem dos registros da coleção deverá ser retornada. Isso permite que o Vinyl exiba a contagem de registros na interface do usuário, além de informar a interface do usuário quando o final da coleção for atingido.

Método HTTP

PEGAR

URL de Exemplo

https://example.com/rest/v1/sales/customers

Exemplo JSON

{
  "count": 2,
  "items": [
    {
      "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
      "name": "John Henry",
      "address": "130 Plutonium Drive"
    },
    {
      "customerId": "9775de33-08fc-4cd2-98ef-d91f3d5355b1",
      "name": "Sally Keith",
      "address": "4500 Neutrino Road"
    }
  ],
  // envelope properties
}

Criar

A operação Create criará um novo registro. O identificador do registro existe no corpo JSON.

Observe que todo o registro é repetido na resposta. Isso é útil nos casos em que alguns campos são criados ou atualizados pelo servidor (como um carimbo de data/hora de criação de registro).

Método HTTP

PUBLICAR

URL de Exemplo

https://example.com/rest/v1/sales/customers

Exemplo de Corpo de Solicitação JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
}

Exemplo de Corpo de Resposta JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
  // envelope properties
}

Atualizar

A operação Update atualizará um registro existente. O identificador do registro é especificado na URL.

Observe que todo o registro é repetido na resposta. Isso é útil nos casos em que alguns campos são criados ou atualizados pelo servidor (como um carimbo de data/hora de atualização de registro).

Método HTTP

  • PUT - Usado para uma atualização completa. Todos os parâmetros do registro precisam ser especificados.
  • POST - Usado para uma atualização parcial. Apenas os parâmetros obrigatórios do registro precisam ser especificados.

URL de Exemplo

https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1

Exemplo de Corpo de Solicitação JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
}

Exemplo de Corpo de Resposta JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
  // envelope properties
}

Excluir

A operação de exclusão excluirá um registro. O identificador do registro é especificado no URL. Nenhum corpo de solicitação precisa ser enviado para DELETE.

Método HTTP

EXCLUIR

URL de Exemplo

https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1

Exemplo de Corpo de Resposta JSON

{
  "item": {
    "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
    "name": "John Henry",
    "address": "130 Plutonium Drive"
  }
}

Parâmetros de Consulta

Obtenha Muitos

Ao nível da recolha, o seu endpoint REST deve suportar as seguintes funcionalidades.

Paginação

Para coleções que contêm muitos registros, muitas vezes é necessário oferecer suporte à paginação. Para suportar a paginação, o Vinyl define os seguintes parâmetros:

Parâmetro de consulta Descrição Exemplo
$limite O número máximo de registros a serem recuperados em uma solicitação. $limit=10
$deslocamento A partir de qual deslocamento de registro a busca deve começar. Os deslocamentos são baseados em zero, portanto, especificar 0 buscará o primeiro registro na coleção. $offset=10
$contar Um booleano que indica se uma contagem de coleção deve ser retornada. No Vinyl, este parâmetro é considerado falso por padrão. $count=true

Ordenação

O vinil pode oferecer suporte à classificação simples de campos.

Parâmetro de consulta Descrição Exemplo
$classificar Uma lista delimitada por vírgulas de nomes de campos pelos quais classificar. Coloque um traço (-) no nome do campo para classificar o campo em ordem decrescente. No exemplo fornecido, classifique a coleção por país, em ordem decrescente, e nomedaempresa, em ordem crescente. $sort=-country,companyName

Filtragem

O Vinyl fornece suporte para uma string de filtro de consultar. A cadeia de caracteres do filtro de consultar dá suporte a um subconjunto da especificação do filtro de cadeia de caracteres de consultar OData 4.0. Para comparações de strings, os curingas podem ser especificados usando o % personagem.

Parâmetro de consulta Descrição Exemplo
$filtro Uma string de consultar no estilo OData 4.0 que filtra dados $filter=country eq 'united%'
Operadores
Comparação
Operador Descrição Exemplo
eq Igual ao valor. categoryId eq 42
neq Não é igual ao valor. categoryId neq 42
gt Maior que o valor. price gt 100
lt Menor que o valor. price lt 100
ge Maior ou igual ao valor. price ge 100
le Menor ou igual ao valor. price le 100
em Combine qualquer valor na lista.
Adicionado no Vinil 3.2.
categoryId in (1, 2, 3)
Lógico
Operador Descrição Exemplo
e E lógico price gt 100 and categoryId in (1,2,3)
Limitações
  • Sem operadores aritméticos
  • Nenhum ou/não operadores lógicos
  • Sem operadores de agrupamento
  • Sem funções de consultar
  • Sem aliases de parâmetro

O vinil fornece um mecanismo para pesquisar registros em uma coleção. Esta pesquisa opera em todos os campos pesquisáveis do registro.

Por padrão, o Vinyl adiciona curingas ao início e ao final da string de pesquisa.

Parâmetro de consulta Descrição Exemplo
$q Uma string de pesquisa a ser aplicada a todas as colunas pesquisáveis de um registro. $q=hello

Convenções de Tipo

Tipos JSON

Como regra geral, os desenvolvedores devem preferir usar os tipos JSON nativos integrados. O Vinyl mapeia automaticamente os tipos JSON nativos, portanto, o uso direto de números, booleanos, strings e nulos é incentivado.

Datas

O vinil codifica datas usando o formato ISO 8601. Todas as datas são serializadas em UTC.

Versionamento

Para lidar com incompatibilidades futuras entre versões da API REST, o Vinyl inclui um número de versão diretamente na URL REST.

URL de Exemplo

https://example.com/rest/v1/...

Operações Opcionais

Outras operações que podem ser úteis para incluir em uma API REST CRUD.

Novo

A nova operação é usada para retornar padrões de registro. Isso é usado antes da criação de um registro para casos em que alguns dados possam ser pré-preenchidos pelo servidor REST.

Método HTTP

  • PEGAR
  • PUBLICAR.

URL de Exemplo

https://example.com/rest/v1/sales/customers(new)

Exemplo de Corpo de Resposta JSON

{
  "item": {
    "customerId": null,
    "daysActive": 0
  }
  // envelope properties
}

JSON - Conversão de Tabelas Relacionais

O Vinyl fornece um mecanismo para converter entre a representação de dados da tabela relacional interna e o JSON esperado pelos endpoints REST.

Matrizes para Tabelas

Cada array em uma estrutura JSON é considerada uma tabela relacional separada dentro do Vinyl.

Dessa forma, a conversão a seguir se aplicaria a um endpoint denominado "customers(get)":

Clientes (obter) JSON

{
  "count": 2,
  "message": "Sample message",
  "status": 200,
  "items": [
    {
      "customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
      "name": "John Henry",
      "address": "130 Plutonium Drive"
    },
    {
      "customerId": "9775de33-08fc-4cd2-98ef-d91f3d5355b1",
      "name": "Sally Keith",
      "address": "4500 Neutrino Road"
    }
  ],
  // envelope properties
}

Estrutura da Tabela Resultante

"clientes (obter)"

Contagem Mensagem Estado
2 Exemplo de mensagem 200

"clientes (obter)/itens"

ID do cliente nome endereço
9775de33-08fc-4cd2-98ef-d91f3d5355b1 Sally Keith Estrada Neutrino 4500
b603b276-a9bf-4328-88ff-8994176c38d1 João Henrique 130 Unidade de Plutônio

Gravando Dados

Atualmente, o Vinyl só suporta gravação em uma única tabela durante um evento. Como cada array JSON é considerado uma tabela separada, talvez não seja possível gravar um objeto inteiro que inclua vários arrays em um único evento Vinyl.

Como resultado, procure minimizar o uso de matrizes JSON sempre que possível ou ofereça suporte à gravação das matrizes em um objeto em um endpoint separado da API REST.

Por exemplo, um objeto “cliente” pode conter vários endereços. Ter um endpoint para escrever o objeto do cliente e outro endpoint para escrever os endereços permite que o Vinyl se integre mais facilmente com sua API REST.