Páginas filhas
  • Guia de implementacao das APIs TOTVS

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

  • Definir práticas e padrões consistentes para todos os endpoints das APIs do fluig;
  • Garantir a utilização mais próxima possível das boas práticas estipuladas pelos padrões REST/HTTP;
  • Tornar os serviços da plataforma fluig acessíveis através de APIs mais fáceis e documentadas para desenvolvedores e consumidores;
     .

Comitê

Criamos um comitê interno, formado com um integrante de cada squad, para discutir e garantir a execução dos padrões definidos neste documento.

Cada um dos membros deve obrigatoriamente ser incluído no pull request de novas APIs publicas e cadas um deles é responsável por garantir a correta disseminação e implementação dentro de seu próprio time das APIs privadas.

 

 

Nomenclaturas

Cliente: Qualquer aplicativo que faça uma requisição para um endpoint do fluig.

...

APIs Publicas são todas as APIs que podem ser acessadas por clientes externos aos times de desenvolvimento do fluig.

 

Estrutura de URLs

Os caminhos definidos para cada endpoint devem ser de fácil leitura e significativos para o cliente para facilitar a sua descoberta e adoção. Os pontos abaixo DEVEM ser considerados ao criar uma URL:

  • Ao referenciar uma entidade na URL ela DEVE estar no plural. Ex. /users ao invés de /user
  • Evite caminhos com mais de 3 parâmetros pois isso dificulta a leitura e normalmente indica um problema arquitetural.
  • O caminho DEVE apontar para um recurso e não para uma ação sobre a entidade, use os verbos HTTP para representar uma ação. Nos casos onde não exista um verbo apropriado a ação pode ser informada como parâmetro no caminho da url ou na url.

 

Exemplo de URLs amigáveis:

...

  • Entidade apresentada no plural e uso correto do parâmetro na url.
    • https://fluig.totvs.com/api/users/{id}
  • Ações sobre entidades no caminho da url e como parâmetro da url.
    • https://fluig.totvs.com/api/workflows/{id}?action=execute
    • https://fluig.totvs.com/api/workflows/{id}/send
  • Relacionando entidades diretamente no caminho
    • https://fluig.totvs.com/api/users/{alias}/communities
    • https://fluig.totvs.com/api/communities/{id}/users
  • URL com suporte a campos expansíveis (linkar para a sessão de campos expansíveis)
    • https://fluig.totvs.com/api/users/{alias}?expand=prop1.subprop,prop2
  • Ordenando e paginando coleções

Exemplo de URLS NÃOamigaveis e que deve ser evitadas:

  • Redundância na definição da url
    • https://fluig.totvs.com/api/communty/listCommunities
  • Ordenação especificada na url
    • https://fluig.totvs.com/api/communty/listCommunitiesWithRelevance
  • Verbos definidos na url ao invés de usar o verbo HTTP e falta de pluralização no substantivo.
    • https://fluig.totvs.com/api/correlationquestion/create
    • https://fluig.totvs.com/api/user/create
    • https://fluig.totvs.com/api/user/delete
  • Identificador da entidade definido como parâmetro e não como caminho (na url)
    • https://fluig.totvs.com/api/document/permissions?documentId={id}

...

Apesar de o padrão definido no documento RFC 7230 da especificação do HTTP 1.1 não definir um tamanho maximo para a url nenhum endpoint do fluig deve ser identificado com uma url maior que 2000 caracteres para garantir que todos os navegares modernos sejam suportados 

Informações

Mais informações sobre a escolha do valor máximo de caracteres pode ser consultada em:

http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184#417184

https://blogs.msdn.microsoft.com/ieinternals/2014/08/13/url-length-limits/

...

  • O parâmetro da url DEVE ter o nome order;
  • O valor do parâmetro order é uma lista de campos, separada por virgula (,) opcionalmente precedida pelos sinal de adição (+) ou subtração (-);
  • A lista DEVE respeitar a ordem dos campos como descrito na url para fazer a ordenação;
  • Campos precedidos por um sinal de subtração (-) devem ser ordenados de forma decrescente;
  • Campos precedidos por um sinal de adição (+) devem ser ordenados de forma crescente;
  • Campos que omitirem o sinal (de adição ou subtração) devem ser ordenados de forma crescente.

Por exemplo, a seguinte requisição deve retornar a lista de usuários ordenados pelo nome de forma crescente e então pela idade de forma decrescente e então pelo sobrenome de forma crescente:

 

Bloco de código
languagetext
GET https://fluig.totvs.com.br/api/users?order=name,-age,+surname

...

Todos os endpoints de coleção DEVEM suportar paginação. A definição de como a coleção deve ser paginada é definida pelos parâmetros de url page e pageSize respeitando as seguintes regras: 

  • Os parâmetros da url DEVEM ter os nomes page e pageSize;
  • O valor do parâmetro page DEVE ser um valor numérico maior que zero representando a página solicitada;
  • O parâmetro page é OPCIONAL e na sua ausência deve ser considerado o valor 1;
  • O valor do parâmetro pageSize DEVE ser um valor numérico maior que zero representando o total de registros retornados na consulta;
  • O parâmetro pageSize é OPCIONAL e na sua ausência deve ser considerado o valor 20;
  • Os parâmetros de paginação DEVEM obedecer a semântica de multiplicador, ou seja, se o cliente solicitou page=2 com um pageSize=20 deve-se retornar os registros de 21 até 40;
  • A resposta de uma requisição com paginação DEVE retornar um campo indicando se existe uma próxima página disponível conforme descrito na mensagem de sucesso de lista (linkar) e esse campo DEVE ter o nome hasNext.

 

Por  Por exemplo, a seguinte requisição deve retornar a terceira página de registros (dos registros 31 á 40 INCLUSIVE) de usuários:

 

Bloco de código
languagetext
GET https://fluig.totvs.com.br/api/users?page=4&pageSize=10

...

Informações

Em alguns casos se faz necessário retornar mais campos do que os estipulados acima. Nestes casos a informação deve ser considerada opcional do ponto de vista do cliente, ou seja, o cliente não deve depender dela para o tratamento do erro.

Mensagens de sucesso

Mensagens de sucesso DEVEM ser retornadas para todos os códigos http 2xx e DEVEM ter pelo menos o campo content que representa o objeto resultado da operação do endpoint. Ex:

Bloco de código
languagejs
{
  content: {}
}

...

Bloco de código
languagejs
{
  hasNext: true,
  content: [
    {},
    {},
    ...
  ]
}

 

Código 4xx versus 5xx

 

Dividimos os erros em duas categorias: Erros de negócio ou requisição e Erros não esperados.

 

Erros de negócio ou requisição são aqueles causados por dados inválidos na requisiçõe ou intencionalmente lançados do endpoint para o cliente. Todos os erros deste tipo devem obrigatoriamente retornar um código HTTP 4xx. Ex:

 

  1. O cliente chamou um endpoint mas não estava devidamente autenticado. Deve ser retornado o código 401 - Unauthorized
  2. O cliente chamou um endpoint mas mesmo estando autenticado não possui as permissões necessárias para efetuar a operação. Deve retornar o código 403 - Forbidden
  3. O cliente chamou o endpoint para buscar um usuário (Ex: /users/{id}) mas o usuário não existe. Deve ser retornado o código de erro 404 - Not found
  4. O cliente chamou o endpoint para efetuar alguma operação mas por alguma regra de negócio a operação não pode ser concluída e não existe um código de erro HTTP apropriado para descrevê-lo. Deve ser retornado o código de error 400 - Bad Request
  5. O cliente chamou o endpoint passando no cabeçalho que aceita como retorno xml (Content-Type: text/xml) mas o serviço consegue retornar JSON. Deve retornar o erro HTTP 406 - Not Acceptable
  6. O cliente chamou um endpoint para subir um documento mas o usuário logado passou o limite de espaço estipulado para seu perfil. Deve retornar o código 507 - Insufficiente Storage;

...

Erros não esperados são os erros não tratados ou não intencionais. Esse tipo de erro devesempre retornar códigos HTTP 5xx. Ex:

 

  1. O cliente chamou um endpoint mas o servidor não pode responder por que estava sobrecarregado. Deve retornar o código 503 - Service Unavailable;
  2. O cliente chamou um endpoint para subir um documento mas não havia espaço em disco no servidor. Deve retornar o código 507 - Insufficiente Storage

Parâmetros expansíveis

Todos os endpoints DEVEM respeitar e suportar os campos expansíveis. E DEVEM retornar os campos retraídos a menos que especificado na requisição atráves do parâmetro de url expand.

...

Por exemplo, a entidade usuário possui propriedades que apontam para suas permissões, comunidades e detalhes e portanto estas devem estar retraídas: 

Bloco de código
languagejs
GET https://fluig.totvs.com/api/users/10

{
  _expandables: ["permissions", "communities", "detailedInformation"],
  id: 10,
  name: "Usuário",
  age: 25,
  permissions: [],
  communities: [],
  detailedInformation: {},
  ...
}

...