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.

...

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

  • 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 facilmente compreendidas e documentadas para desenvolvedores e consumidores.

...

  • Ao referenciar uma entidade na URL ela DEVE estar no plural. Ex. /users 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 URL ou na urlURL.


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
    • https://fluig.totvs.com/api/users/{alias}?expand=prop1.subprop,prop2
  • Ordenando e paginando coleções

 

Exemplo de URLS NÃO amigaveis 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 máximo 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
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/

...

  • 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 sinais 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.

...

Os campos como query param e os campos tem que estar documentados no swagger informando o tipo de filtro que é aplicado. Cada endpoint pode suportar os campos que quiser. e E nem todos os endpoints precisam ter filtro. 

...

Na tabela abaixo serão listados os métodos que DEVEMser suportados. Nem todos os endpoints devem suportar todos os métodos, mas os que usarem utilizados DEVEM respeitar a utilização conforme descrita.

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 usado 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

...

VerboUsado paraTipo de operaçãoCódigo de sucessoDetalhes
POSTCriar uma entidadeSíncrona201Além do código de sucesso deve retorna retornar a nova entidade criada.
PATCH ou PUTAtualizar uma entidadeSíncrona200Além do código de sucesso deve retorna 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

...

A utilização destes cabeçalhos não é obrigatória para todos os endpointsmas os que os usarem utilizarem DEVEM obedecer as regras descritas aqui.

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. Endpoints 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 no 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 reposta repostas, a menos que explicitamente citado o contrário na coluna obrigatório

...

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 DEVEDEVEM 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éria série de cabeçalhos para quase todas as situações e estas sempre tem precedência a um cabeçalho customizado.

...

Formato das mensagens de resposta

O JSON DEVE ser o formato padrão para mensagens e as propriedades destas mensagens DEVEM ser escritas usando camelCase.

...

  • O campo code deve identificar unicamente o erro na documentação da API;

    Informações

    Todos os códigos de error DEVEM estar mapeados e listados na documentação da API.

  • O campo helpUrl deve apontar para diretamente para documentação do erro na API;
  • O campo message deve descrever o erro de forma não técnica e pode ser usado pelos clientes para exibição ao usuário. O texto deste campo deve respeitar o idioma usado na requisição (definido pelo cabeçalho Accept-Language ou o padrão caso este não seja especificado);
  • O campo detailedMessage deve descrever o erro de forma mais técnica e pode conter referências que ajudem na correção / localização do erro no contexto do servidor do fluig.

...

Nos casos em que o resultado da operação do endpoint represente uma coleção além do campo content deve ser retornado o campo hasNext, indicando se existe uma próxima página com mais registros para aquela coleção.

...

Erros de negócio ou requisição são aqueles causados por dados inválidos na requisiçõe requisições 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 autenticado passou o limite de espaço estipulado para seu perfil. Deve retornar o código 507 - Insufficiente Storage;

...

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

...

Caso o cliente queira expandir as propriedades ele DEVE então fazer uma requisição informando o parâmetro expand na url e passando como valor uma lista separada por virgula (, (virgula) dos  dos campos exatamente como descritos no campo _expandables.

...