API Quick Reference Guide
API Quick Reference Guide
Reference Guide
Por que
investir em uma
estratégia de API
A A disrupção digital tem impactado profundamente todas as empresas. A rapidez das trans-
formações evoluí a um ritmo nunca visto na história. A necessidade é iminente para ser ágil e
inovador.
A economia das APIs tem sido uma pedra fundamental dessa história. O crescimento de novas
conexões e trocas de valores entre empresas, dispositivos e sistemas é exponencial. Empresas
tem adotado APIs não apenas para endereçar questões técnicas, mas também para criar novos
modelos de negócio. Abaixo os principais cenários de uso:
ESCLARECIMENTOS
Este guia de referência não reivindica ser absolutamente completo. Os conceitos de design des-
critos são resultados dos dilemas mais comuns no design de API. Acesse sensedia.com/resour-
ces e sinta-se à vontade para baixar este arquivo e comentar sobre o conteúdo deste encarte.
RESTful API
Design
A
Assim que começamos a trabalhar com APIs, normalmente surgem dúvidas e consequentes di-
lemas de Design. Um Design robusto é um fator-chave para o sucesso nas suas exposições. APIs
mal projetadas comumente levam a usos indevidos ou, pior ainda, acabam por não serem utiliza-
das pelos seus principais clientes: os desenvolvedores.
• Utilização dos princípios RESTful, conforme descritos pelos seus principais idealizadores
(Roy Fielding, Leonard Richardson, Martin Fowler),
• As especificações HTTP, em detalhe
• Como opção, o acompanhamento sobre a forma com que os “Web Giants” utilizam APIs
• Purista,
Purista que foca em seguir os princípios do REST independente de contexto.
• Pragmática,
Pragmática que trabalha uma abordagem mais personalizada, para fornecer aos seus
parceiros uma API mais prática no dia-a-dia.
→ A solução mais recomendada é permear entre as duas abordagens e criar a sua própria, ade-
quada ao seu contexto de desenvolvimento.
Projetar uma API REST levanta questões e problemas para os quais não há uma resposta univer-
sal. As melhores práticas REST ainda estão em debate, e sua consolidação ainda está em pro-
gresso.
Para facilitar - e acelerar - o design e o desenvolvimento das suas APIs, a SENSEDIA está com-
partilhando suas visões e recomendações neste encarte de referência. Este conteúdo vêm da
nossa expertise e vanguarda em atuação com APIs há mais de 10 anos.
Conceitos Gerais
K.I.S.S.
<Keep It Simple, Stupid/>
Q
Qualquer pessoa conseguirá utilizar a sua API sem a necessidade de consultar a documentação.
> Use termos padrões, concretos e públicos, e não utilize termos internos, comerciais ou
siglas específicas.
> Não permita que os desenvolvedores façam a mesma coisa de diversas formas
(padronize e reaproveite).
> Crie sua API para seus desenvolvedores, não para seus dados/sistemas.
> Priorize as APIs do seu negócio e depois disponibilize as exceções
NETWORK FALLACIES
Exemplos Funcionais
Compartilhe cURL com exemplos simples e objetivos, copy/past funcionais.
CURL -X POST \
-H ‘Authorization: Basic ZWM3NDIxMQ==’ \
-H ‘Content-Type: application/x-www-form-urlencoded’ \
-d grant_type=client_credentials \
https://api.sensedia.com/oauth/access-token
Granularidade
Recursos com granularidade “média”
Não seja muito detalhista ou pouco detalhista. Uma sugestão é a hierarquia dos recursos
não terem mais do que dois níveis de profundidade:
[GET] /clients/dr241s
{ “id”:”rt874f”,
“name”:”Fabrício Alves”,
“age”:”40”,
“address”:{
“street”:”Rua Dr. Zero”,
”city”:{“name”:”Campinas”}
}
}
Segurança
OAuth2/OIDC & HTTPS
- Produção: api.sensedia.com
- Sandbox: api-sandbox.sensedia.com
- Teste/qa.: api-test.sensedia.com (interno)
- Desenvolvimento: api-dev.sensedia.com (interno)
Substantivos
Utilize sempre substantivos e não verbos (vs SOAP-RPC).
Pluralidade
Nomenclaturas com substantivo no plural.
Os recursos representam um conjunto de entidades, seu nome deve ser sempre no plural.
Permaneça consistente.
Estrutura hierárquica
URL criada por uma estrutura hierárquica com agregações ou decomposições e ordenado
por relevância.
[GET] /shoppings/s28er/orders/r43ed/products
Consistência da nomeação (case)
Utilize spinal-case na sua URI e lowerCamelCase ou spinal-case nos atributos, parâmetros
e values da sua header e body e permaneça consistente na sua escolha.
Obs: Caso utilize “snake_case”, assegure que os seus clientes sejam compatíveis com esse padrão, pois
alguns compiladores e Webservices ignoram o caractere “underline”.
Versionamento
Implemente o controle de versão na URL e exponha apenas o seu major version.
[GET] /v1/clients
Mantenha no máximo 2 versões ativas e, para a versão mais antiga defina a sua data
de desligamento (coloque esta informação na header dos responses “X-Api-Deadline”
e “X-Api-Deadline-Information”).
Listagem dos
../beers/dr241s/ Cria novo item na Erro Erro Erro
items da beer
items order dr241 <HTTP Status 405> <HTTP Status 405> <HTTP Status 405>
dr241s
Pesquisa, Filtros, Respostas
parciais e Ordenações
Utilize notações de pesquisa e filtros para limitar o retorno dos seus registros de forma
eficiente.
[GET]../v1/beers?status=paid (subconjunto)
[GET]../v1/beers?_fields=number,date,address(street) (otimização com respostas parciais)
[GET]../v1/beers?_sort=date (ordenação ascendente)
[GET]../v1/beers?_desc=date (ordenação descendente)
[GET]../v1/beers?name=*Sensedia* (like)
[GET]../v1/beers?items=_greaterThan(10) (restrição “>=”)
[GET]../v1/beers?items=_lessThan(10) (restrição “<=)
[GET]../v1/beers?items=_between(4,8) (restrição)
[GET]../v1/beers?date=YYYY-MM-DDThh:mm:ssTZD (date)
[GET]../v1/beers?items=[2,4,8] (vetor)
[GET]../v1/beers?_first (primeiro registro)
[GET]../v1/beers?_last (último registro)
[GET]../v1/beers?_count (total registros)
* Se passar um valor, nos atributos “_records” e/ou “_limit”, maior que o especificado no “ac-
cept-range”, teremos o erro Status Code 412.
• Data: “YYYY-MM-DD”, onde será assumida a hora 00:00:00 do mesmo time zone do servidor;
• Hora: Utilizar “hh-mm-ss”;
• TimeStamp: Utilizado YYYY-MM-DDThh:mm:ssTZD, respectivamente data, hora e Time Zone.
Estrutura de Dados
A solicitação de dados deve sempre seguir os padrões RESTful.
Content-Type : application/json
Exceções perigosas, porém
excepcionalmente necessárias
Por definição do RESTFul, qualquer operação deve ser visto e manipulado como um recurso.
Na vida real, nem sempre é possível, especialmente quando temos que lidar com ações como
traduções, cálculos, conversões, serviços empresariais complexos ou serviços fortemente
integrados (legado).
Em casos excepcionalmentes raros, nas requisições POST, você pode utilizar um “verbo” no
final da URI.
[POST] /calculator/sum
-> Body: [1,2,3,5,8,13,21]
[POST] /convert?from=EUR&to=USD&amount=4
No entanto, antes de seguir esta exceção, tenha certeza que as notações RESTful não te atende.
Hateoas
Sempre que possível disponibilize hyperlinks no response das sua APIs, desta forma possibi-
litará a obtenção de mais informações.
Mas não se iluda, por ser uma técnica relativamente nova, poucos utilizarão os hyperlinks.
Explicite esta possibilidade na sua documentação.
GET /users/dr241s
-> 200 Ok
-> {“id”: “dr241s”, “firstname”: “Fabrício”, “...”: “...”,
“links”: [ {
“href”: “addresses/18”,
“rel”: “addresses”,
“type”: “GET” } ] }
Successful - 2xx
Indica a execução com sucesso de uma operação que não retornará infor-
204 No Content mação. Normalmente utilizada como resposta dos DELETEs, PUTs e GETs
em coleções vazias.
ANT PATTERN
company.galleries.editPhoto
Client Error - 4xx
400 GET /beers?barley=true
Status genérico de erro para requisições que não 400 Bad Request
Bad Request atende o número mínimo de requisitos atendidos. { “message”: “Parâmetro ‘barley’ inválido” }
403 Sua credencial não tem privilégios suficientes para GET /beers/42e2a/Ingredients
Forbidden acessar o recurso que está solicitando. 403 Forbidden
{ “message”: “Você não tem permissões suficientes” }
422 Ocorreu algum erro de negócio com sua mensagem. PUT /beers/42e2b
Unprocessable Sintaticamente correto, semanticamente não. 422 Unprocessable Entity
Entity { “message”: “O campo Ingredients está inválido” }
GET /beers/42e2a
503 Service O servidor não consegue processar agora devido a
503 Service Unavailable
Unavailable alguma indisponibilidade momentânea. { “message”: “O servidor não consegue processar
agora. Tente mais tarde.” }
504 Gateway O servidor não consegue processar agora devido a GET /beers/42e2a
504 Gateway Timeout
Timeout alguma sobrecarga momentânea.
{ “message”: “O servidor não consegue processar
agora. Tente mais tarde.” }
GET /beers/42e2a
502 Bad Gateway
502 Bad O Proxy Server ou API Gateway não conseguiu identi- { “message”: “The server, while acting as a gateway
Gateway ficar exatamente o “erro” reportado pelo Backend. or proxy, received an invalid response from an
inbound server it accessed while attempting to
fulfill the request.” }
GraphQL
GraphQL é uma Query Language baseada em grafos onde é possível consultar os nós e tam-
bém conexões entre eles.
Uma das principais limitações encontradas com REST e resolvidos pelo GraphQL é fornecer
exatamente o que o desenvolvedor precisa. Nada a mais e nada a menos. Isso inclui navegar
relacionamentos com outros nós (objetos) em uma única consulta, otimizando imensamen-
te o tráfego de informações ao desenvolvedor e evitando que novos endpoints específicos
sejam criados para otimizar um parceiro em particular.
Mas quando deve-se usar o Graphql? Lembre-se que não existe uma bala de prata, se uma
solução deu certo para um parceiro, não quer dizer que dará para você. Preparamos um che-
cklist para você decidir se deve ou não utilizar o Graphql, a Sensedia tem um time de consul-
tores que pode auxiliá-lo nesta decisão.
GraphQL
Devo ou não utilizar?
Usar:
• Quando pode ser introduzido incrementalmente.
• Estão puxando dados de uma variedade de fontes, como vários bancos de dados e estão
usando APIs externas que compõem uma única solução final.
Não Usar:
• Precisa ter um bom efeito com uma rede de desenvolvedores terceiros em prazo imediato.
sensedia.com/resources
19 3705.5775