Versões comparadas

Chave

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

...

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

Estrutura de URLs

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

...

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. Usamos como base a estrutura "{protocolo}://{host}/{api}/{produto}/{agrupador}/{dominio}/{versao}/{recurso}". Ex: https://fluig.totvs.com/api/fluig/ecm/v1/users. A partir deste ponto 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.

...

Informações

APIs escritas utilizando o protocolo de mensagem padronizada não devem definir o nome do produto na URL. A ideia de APIs padronizadas é que a mesma assinatura atenda diferentes produtos.

A assinatura de API padronizada segue a nomenclatura abaixo:

 "{protocolo}://{host}/{api}/{agrupador}/{dominio}{versao}/{recurso}"



Estrutura OAS (Open Api Specification 3.0.1):

Bloco de código
languagejs
openapi: 3.0.1
info:
  title: Estrutura de Url para API's
  description: 'Consideramos uma API o agrupamento de endpoints que façam parte da mesma unidade de negócio. Usamos como base a estrutura "{protocolo}://{host}/{api}/{produto}/{agrupador}/{dominio}/{versao}/{recurso}"'
  version: '1.0'
externalDocs:
  url: 'http://tdn.totvs.com/display/INT/Guia+de+implementacao+das+APIs+TOTVS'
servers:
  - url: '{protocolo}://{host}/{api}/{produto}/{agrupador}/{dominio}/{versao}/{recurso}'
    variables:
      protocolo:
        default: https
        enum:
          - http
          - https
      host:
        default: host
      api:
        default: api
      produto:
        default: produto
      agrupador:
        default: agrupador
      versao:
        default: versao
      recurso:
        default: recurso
paths: {}
components: {}

...

Exemplo de filtros no padrão odata:

OperatorDescriptionExample
Logical Operators
eqEqual/Suppliers?$filter=Address/City eq 'Redmond'
neNot equal/Suppliers?$filter=Address/City ne 'London'
gtGreater than/Products?$filter=Price gt 20
geGreater than or equal/Products?$filter=Price ge 10
ltLess than/Products?$filter=Price lt 20
leLess than or equal/Products?$filter=Price le 100
andLogical and/Products?$filter=Price le 200 and Price gt 3.5
orLogical or/Products?$filter=Price le 3.5 or Price gt 200
notLogical negation/Products?$filter=not endswith(Description,'milk')
Grouping Operators
( )grouping/Products?$filter=(Price lt 5)


Filtros de data Modificação (opcional)

...

Na tabela abaixo serão listados os métodos que devem ser suportados. Nem todos os endpoints devem suportar todos os métodos, mas os que o fizerem 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
PUT http://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
DELETE

Exclui 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

Também usado para atualizar uma entidade, mas diferente do PUT, recebe em seu corpo uma série de instruções ou o estado no qual o cliente gostaria que a entidade estivesse no final da operação. Deve ser tratado de forma atômica, ou seja, ou todas as instruções foram completadas com sucesso ou deve retornar erro ao cliente.

PATH pode causar efeitos colaterais e portanto não é considerado seguro ou idempotente.

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

[
  { "op": "replace", "path": "/name", "value": "Bob" }
]

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

Corpo de mensagem e Query String

...

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, 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 um recurso temporário que permita o acompanhamento do status da requisição. Por exemplo, considere o endpoint de cadastro assíncrono de usuários:

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

DEVE retornar como resposta:

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

Como escolher o método adequado

...

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.

...


...