Guia Pocket para construção de API's

URL's

Devem seguir o formato:

http://{{host}}/api/{{agrupador}}/{{versão}}/{{recurso}}

Deve ser orientada a recursos representados por substantivos no plural. Não se deve orientar a verbos.

O recurso representa uma coleção, em que cada elemento possui um identificador único:

/beers
/cars
/products/{id}
/beers/{id}/reviews/{id}
Nunca faça isso!
/getbeer

Apenas a Major Version é exposta na URL:

/v1/{{recurso}}
/v2/{{recurso}}
/v3/{{recurso}}
Nunca faça isso!
/v1.2.31/{{recurso}}

Verbos HTTP
GET
Retorna um item ou uma coleção de itens;
POST
Realiza uma operação não previsível em um item ou uma criação
PUT
Insere ou atualiza um item;
DELETE
Exclui um item.

Formato de data e hora

Data

yyyy-mm-dd

Hora

hh:mm:ss:ffff

Data e hora

yyyy-mm-ddThh:mm:ss

HTTP status de sucesso (2xx)

O servidor retorna um código indicando o resultado do seu processamento, conhecido como HTTP Status.
O status da família 2XX indica sucesso da operação solicitada, tendo como principais códigos ao lado:
200
ok.
201 - created (criado)
Quando determinado, foi criado corretamente.
202 - accepted (aceito)
Comumente utilizado em transações assíncronas, indicando que a comunicação foi bem-sucedida, mas ainda não foi processada.

HTTP status de redirecionamento (3XX)
O status desta família indica que a requisição foi redirecionada no backend, raramente tratado pelas camadas finais. Esta informação é mais importante para a camada de comunicação.

HTTP status de erro do usuário (4XX)

O status da família 4XX indica que alguma informação passada pelo usuário está incorreta ou que alguma validação da regra impediu o processo. Os status mais comuns são:
400 - Bad Request
Alguma informação não corresponde ao esperado, geralmente atrelado à regra de negócio.
401 - unauthorized & 403 forbidden
O usuário passado não tem acesso ao sistema ou não tem permissão para executar a ação desejada, respectivamente.
404 - Not found
O recurso solicitado não foi encontrado.

HTTP status de erro do servidor (5XX)

Utilizado quando ocorre algum erro inesperado no servidor e que, não necessariamente, está ligado às informações da requisição do usuário. Os status mais usados são:
500 - Internal server error
Erro inesperado ou não tratado no servidor.
502 - Bad gateway
API Gateway não conseguiu se comunicar com o backend.
503 - Service unavailable
o servidor está em manutenção ou indisponível temporariamente.

Paginação
/users?page=1&pagesize=20
Retorna os vinte primeiros registros. Caso esses parâmetros não sejam informados, nunca retorna a coleção completa, mas considera o valor default 1 para page e 10 para pagesize.
{
“hasnext”: true,
“items”:[...]
}
“hasNext” como valor true indica que essa não é a última página.

Requisições assíncronas
Devem ser implementadas para operações demoradas;

POST, PUT ou DELETE
Em recursos que funcionam de maneira assíncrona deve retornar 202 (Accepted).

GET
- Em recursos temporários, que ainda estão em processamento, deve retornar 200 (Ok). O JSON de retorno deve conter a propriedade “status” com o valor “pending”.

- Ao término do processamento, deve retornar 303 (See Other). O endereço definitivo do recurso criado é informado através do cabeçalho “Location”.

Versionamento
Na API, utilizamos semantic versioning, um padrão que é dividido em major, minor e patch. Somente a Major Version é utilizada na URL. Por exemplo:

Mudança de Minor Version:
1.001 1.002
URL continua V1

Mudança de Major Version:
1.001 2.000
URL DEVE ser alterada para V2


Parâmetros header e path

Header: Requisições HTTP são divididas em header e body. Alguns parâmetros são enviados no header, como Authorization.

Path: É possível definir um parâmetro junto com a URL. Geralmente, ele é utilizado para identificar a entidade a ser requisitada ou processada. No padrão da TOTVS, esses IDs DEVEM estar presentes no corpo da requisição.


Filtros e ordenação
Filtro
/user?name=gilberto&surname=barros
Traz apenas os usuários com o primeiro nome “gilberto” e o sobrenome “barros”.

Ordenação
/users?order=name,-age
Retorna usuários com nomes em ordem alfabética e dá prioridade ao mais velhos como critério de desempate.

Atributos
Fields
/user?fields=’rg,nome’
Um padrão adotado pela TOTVS é o parâmetro fields, onde é possível informar uma lista com os campos desejados na resposta. Os que não forem informados não irão constar na resposta.
{
“rg”:”12345678”,
“nome”: “carlos”
}

Expansíveis
/user?expand=permissions
São sublistas no corpo da mensagem que podem ser retraídas para economia de banda. A propriedade _expandables informa quais atributos foram retraídos e que, consequentemente, podem ser expandidos.
{
“_expandables”: [“permissions”, …]
}

Corpo de resposta
Ao processar uma requisição, o servidor irá gerar uma resposta que, além do HTTP Status, pode apresentar um conteúdo (corpo):
Sucesso
Ao processar um item, a API pode ou não retornar um corpo na resposta, Dependendo da ação realizada. O padrão é definido pela área que cria a API
Lista
Uma resposta a uma lista no padrão TOTVS deve conter 2 atributos. O HasNext indica se há mais algum recurso na base fora da paginação e o Items, a resposta da requisição.
{
“hasNext”: true,
“items”:[{
“nome”: “prod1”,
“id” : 1
},{
“nome”: “prod2”,
"id”: 2
}]
}