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.

Índice

Índice
maxLevel4
outlinetrue
exclude.*ndice
stylenone

Introdução

 

Este documento define os padrões que devem ser adotados durante a implementação de novas APIs publicas ou privadas na plataforma do fluig incluindo:

...

Nota
titleAtenção

Atente-se para esta documentação. Para garantir um bom desenvolvimento de APIs publicas ou privadas, é imprescindível que os passos a seguir sejam respeitados.

Termos e Nomenclaturas

 

Os termos deve, não deve, requerido, pode, não pode, recomendado, opcional devem ser interpretados como descritos no padrão RFC-2119.

...

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

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.

...

Estrutura de URLs

Como regra geral seguimos os passos abaixo sempre que precisarmos criar um novo recurso:

...

Informações
titleFique atento!

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/

Agrupamento

Consideramos uma API o agrupamento de endpoints que façam parte da mesma unidade de negócio, criar um novo grupo de endpoints implica em preocupações como versionamento, disponibilidade e documentação. Apesar de não definirmos uma estrutura única com uma séria de regras para esses agrupamentos (já que não conseguimos generalizar todas as linhas de negócio) deve-se considerar como regra básica a complexidade necessária para descobrir estes endpoints, ou seja, O agrupamento deve facilitar e não complicar a descoberta dos serviços.

...

Bloco de código
languagexml
GET http://fluig.totvs.com/api/ecm/v1/documents
GET http://fluig.totvs.com/api/bpm/v1/workflows
GET http://fluig.totvs.com/api/lms/v1/classes

 

Formatos de Data


Todos as transações de informação que suportam campos de data, tanto no corpo das mensagens quanto nas urls, devem usar o formato definido no documento ISO-8601 no formato EXTENDIDO.

Coleções

Ordenação

Todos os endpoints de coleção devem suportar ordenação. A definição de como a lista deve ser ordenada é definida no parâmetro de url order respeitando as seguintes regras:

...

Informações
titleOrdenão na URL

Se um tipo de ordenação é usado constantemente ou é complexa demais para definir como parâmetros na pode-se considerar criar um endpoint para representá-la desde que essa siga as boas praticas na definição da URI.


Filtros

As coleções podem suportar filtro e deve usar as técnicas abaixo de acordo com a complexidade exigida pela função:

Filtros simples

Filtros simples devem usar parâmetros de query no formato propriedade=filtro e as propriedades suportadas e como elas serão interpretadas devem estar listadas na documentação do endpoint. Ex:

Bloco de código
languagetext
GET https://fluig.totvs.com.br/api/users?name=john&surname=doe

Filtros complexos

Filtros complexos e que forneçam uma linguagem de filtro devem seguir o padrão definido para os filtros no documento ODATA na versão 4.

Filtros como ações

Além das opções acima é possível definir um filtro como uma ação e usar o método POST. Neste caso a url deve seguir as boas praticas para não poluir as URIs da API.

...

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

Métodos suportados

 

Endpoints devem usar os métodos HTTP adequados e devem respeitar a idempotência da operação.

...

MétodoDescriçãoIdempotente
GETRetorna o valor corrente do objeto.Sim
PUT

Sobrescreve o objeto quando aplicável. Por exemplo: O cliente gostaria de sobrescrever o usuário com novos valores:

Bloco de código
languagetext
POST http://fluig.totvs.com/api/users/10

{
  name: "",
  age: 20,
  ...
}
Informações
titleImportante

Caso o cliente não informe alguma propriedade para ser atualizada, está deve ser considerada nula. Está informação deve estar clara na documentação do método para que o cliente não há utilize inadvertidamente, ou pode-se optar por não implementá-la.

Sim
DELETEExclui o objeto.Sim
POSTCria um novo objeto ou submete um comando ao objeto.Não
HEADRetorna os metadados da requisição em casos em que o cliente não precisa do corpo das requisições do tipo GET.Sim
PATCH

PATH foi padronizado pelo IETF como o método utlizado para atualizar um objeto de forma incremental (ver RFC 5789), ou seja, apenas as propriedades informadas pelo cliente serão atualizadas. Por exemplo: O cliente gostaria de atualizar o nome do usuário e para isso vai usar o endpoint de atualização de usuários

Bloco de código
languagetext
POST http://fluig.totvs.com/api/users/10

{
  name: "Novo nome do usuário"
}

O servidor deverá implementar o serviço de modo que apenas o nome do usuário seja atualizado e todas as outras propriedades sejam mantidas.

Não
OPTIONSDeve retornar pelo menos o campo Allow no cabeçalho da resposta listando os verbos suportados pelo endpoint.Sim

POST x PUT x PATCH

Deve-se atentar aos códigos de retorno para os tipos de operações definidos para usar estes métodos principalmente nos casos definidos abaixo:

VerboUsado paraTipo de operaçãoCódigo de sucessoDetalhes
POSTCriar uma entidadeSíncrona201Além do código de sucesso deve retornar a nova entidade criada.
PATCH ou PUTAtualizar uma entidadeSíncrona200Além do código de sucesso deve retornar a nova entidade atualizada.
POST, PATCH, PUTCriar ou atualizar entidadeAssíncrona202

O código 202 informa ao cliente que o serviço aceitou a requisição para processamento e que isso pode levar um tempo para concluir. Nesse caso o endpoint deve retornar o campo Location no cabeçalho da resposta apontando para onde a nova entidade poderá ser encontrada. Por exemplo, considere o endpoint de cadastro assíncrono de usuários:

Bloco de código
languagetext
POST https://fluig.totvs.com/api/users
{
 ...
}

DEVE retornar como responta:

Bloco de código
languagetext
202 Accepted
Location: https://fluig.totvs.com/api/users/10

Padrões de cabeçalhos de requisição

A utilização destes cabeçalhos não é obrigatória para todos os endpoints, mas os que os utilizarem devem obedecer as regras descritas abaixo.

HeaderTipoDescrição
AuthorizationliteralCabeçalho usado para autorização das requisições
DatedataData e hora da requisição com base no calendário do cliente no formato estipulado em RFC 5322
Acceptenumerador de tipo de conteúdo

O tipo de conteúdo esperado para a resposta como por exemplo:

  • application/xml
  • text/xml
  • application/json
  • text/javascript

De acordo com os padrões HTTP, este valor é apenas uma dica para o servidor e as respostas podem retornar valores em formatos diferentes dos informados.

Accept-EncodingGzip, deflateEndpoints devem suportar codificação GZIP e DEFLATE por padrão exceto em casos em que isso implique na performance.
Accept-Language"en", "es", "pt"Especifica o idioma preferencial da resposta. Os endpoints devem suportar e respeitar estes valores em casos em que uma mensagem é retornada ao usuário. Caso o idioma informado não seja suportado, deve-se retornar ao idioma padrão (pt).
Content-Typetipo de conteúdoTipo do conteúdo sendo passado na requisição. O endpoint deve respeitar esta informação na hora de interpretar a informação passada pelo cliente ou retornar um erro apropriado caso o valor não for suportado.

Padrões de cabeçalhos de respostas

Endpoints devem retornar estes cabeçalhos em todas as repostas, a menos que explicitamente citado o contrário na coluna obrigatório.

CabeçalhoObrigatórioDescrição
DateEm todas as respostasHora em que a resposta foi processada baseada no calendário do servidor no formato estipulado em RFC 5322. Ex: Wed, 24 Aug 2016 18:41:30 GMT.
Content-TypeEm todas as respostasO tipo de conteúdo enviado do endpoint para o servidor.
Content-EncodingEm todas as respostasGZIP ou DEFLATE como for apropriado.

 

Cabeçalhos customizados

Cabeçalhos customizados não devem ser utilizados para representar qualquer estado, valor ou ação sobre a entidade representada pela url. Isso quer dizer que cabeçalhos não devem ter relação com o cliente do endpoint (mobile, desktop, etc), url, corpo da mensagem, corpo da resposta ou parâmetros da url. O protocolo HTTP oferece uma série de cabeçalhos para quase todas as situações e estas sempre tem precedência a um cabeçalho customizado.

Nos casos extremos onde não houver outra maneira de representar a informação, pode-se optar por criar um cabeçalho que deve estar descrito na documentação do endpoint e este deve seguir o padrão X-fluig-[Nome do cabeçalho]

Formato das mensagens de resposta

JSON deve ser o formato padrão para mensagens e as propriedades destas mensagens devem ser escritas usando camelCase.

Todos os endpoints devem suportar este tipo de conteúdo.

Tipos de dados JSON

Os tipos de dados e a notação para os campos da mensagem JSON deve seguir os padrões descritos no documento ECMA-404.

Informações
titleImportante

Os campos do JSON que representam data devem usar o formato definido no documento ISO-8601 no formato EXTENDIDO.

Mensagens de erro

Para todas as mensagens que representam um erro (códigos HTTP 4xx e 5xx) deve-se retornar obrigatoriamente os campos a seguir:

...

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 data que representa o objeto resultado da operação do endpoint. Ex:

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

Âncora
ApiSuccessMsgColl
ApiSuccessMsgColl
Mensagens de sucesso para coleções

Nos casos em que o resultado da operação do endpoint represente uma coleção, os itens devem estar agrupados em um objeto com as propriedades hasNext, indicando se existe uma próxima página com mais registros para aquela coleção e itens que representam a lista de itens retornados.

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

Código 4xx versus 5xx

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

...

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 através do parâmetro de url expand.

...

Bloco de código
languagejs
GET https://fluig.totvs.com/api/users/10?expand=communities.permissions

{
    data: {
        _expandables: ["permissions", "detailedInformation"]
        id: 10
        name: "Usuário"
        age: 25
        permissions: []
        communities: [{
            name: "Vendas",
            photoUrl: "https://fluig.totvs.com/communities/1/photo",
            permissions: {
                isAdmin: true,
                canView: true
            }
        }, {
            name: "Outra comunidade",
            photoUrl: "https://fluig.totvs.com/communities/2/photo",
            permissions: {
                isAdmin: true,
                canView: true
            }
        }]
        detailedInformation: { }

    }
}


Versionamento

As APIs devem ser versionadas sempre que alguma alteração quebrar o contrato entre o usuário e a plataforma, a versão deve estar presente na URI e deve estar no forma v{major.minor}.

...

 

Bloco de código
languagejs
http://fluig.totvs.com/api/v1/users
http://fluig.totvs.com/api/v1.5/users
http://fluig.totvs.com/api/v2/users

Duas versões da API podem ser suportadas e neste caso deve existir uma politica de depreciação e esta deve estar documentada em um local acessível ao usuário final.

Informações
titlePolitica de depreciação.

A politica de depreciação deve definir o ciclo de vida da versão da API estipulando um tempo limite em que ela recebera suporte e estará disponível. A politica é pode ser única para cada área de negócio mas deve estar documentada e evidente para o usuário final.

Quando alterar a versão?

O numero da versão indica para o cliente quando alguma alteração pode "quebrar" o código escrito por ele. Deve-se tomar um cuidado especial no processo de versionamento para que o cliente esteja ciente dessas alterações e a frequência com que elas acontecem usando algum tipo de release notes ou documentação.

Alterações que devem gerar uma nova versão "minor":

  • URIs foram removidas ou renomeadas;
  • Foram removidos campos do retorno de um endpoint;
  • Foi removido o suporte a um método do endpoint (GET, PUT, POST, etc);
  • Um novo parâmetro obrigatório é exigido para o correto funcionamento do endpoint;
  • Um novo endpoint foi adicionado a API.

Alterações que NÃO devem gerar uma nova versão "minor":

  • Um novo formato de retorno é suportado pelo endpoint;
  • Novas propriedades são retornadas na entidade de retorno do endpoint;
  • Novos parâmetros opcionais podem ser passados para o endpoint.


Documentação

 

Todas os métodos, parâmetros, códigos de erro e mensagens de requisição e retorno da API publica devem estar documentadas na página de documentação do fluig. Além disso deve ser gerado um documento SWAGGER com as definições da API.