API, REST, RESTful

Conceitos e exemplo prático
Voltar

API:

Application Programming Interface tem função de intermediar comunicação universal entre diferentes sistemas, assim como do banco de dados com o próprio sistema (interno ou externo), utilizando protocolo de comunicação HTTP (XML/JSON), requisitados via URL específica, independente da tecnologia do sistema que irá consumí-la (acessá-la).

  • URL: http://www.sistema.com
  • URL + URI: http://www.sistema.com/api/produtos
  • Endpoint coleção: /api/produtos
  • Endpoint individual: /api/produtos/2

Estrutura de URL:



REST:

Representational State Transfer. Técnica que consiste em princípios que, quando seguidos, permitem a criação de projetos (web services) com interfaces/arquitetura bem definidas (padrão REST), utilizando novos métodos/verbos REST HTTP:

  • POST: Create
    • /api/produtos
    • /api/produtos/42 (requer body(XML-JSON) no header request)

  • GET: Read
    • /api/produtos
    • /api/produtos/42

  • PUT: Update
    • /api/produtos (requer body(XML-JSON) no header request)
    • /api/produtos/42

  • DELETE: Delete
    • /api/produtos
    • /api/produtos/42

Nativamente, o HTTP é Stateless (Não guarda estado). Com o uso de REST, permitirá que as requisições HTTP armazenem dados (estados). Os Web services que estão em conformidade com o estilo arquitetural REST são denominados Web services RESTful. Um sistema é considerado RESTful quando segue corretamente o padrão REST.


HTTP Request e Response:


Request:

Requisição HTTP do dispositivo ao servidor web. Incluem dados de pares chave/valor na URI (query string).
Ex: /api/produtos?order=desc&limit=5

Header da request:
  • Accept: Especifica formato do arquivo desejado pelo requester
    • Accept: application/xml
    • Accept: application/json
    • Accept: application/pdf
  • Accept-Language: Idioma do conteúdo
  • Cache-Control: Conteúdo pode ser consumido do cache e o tempo em que o cache é atualizado

Versão da API: /api/v1/produtos


Response:

Resposta HTTP do servidor web ao dispositivo, sob sua requisição.

  • Na requisição existe query string?
  • Qual foi o verbo HTTP que realizou a ação?
  • Quais os dados do header?
  • Qual o formato requisitado?
  • Quais dados da coleção ou indivíduo do recurso solicitado precisam ser enviados?
Header da response:
  • Content-Type: text/javascript (Formato de dado conforme requisitado)
  • Last-Modified: Tue, 15 Jan 2023 12:45:26 GMT
  • Expires: Thu, 22 Jan 2023 16:00:00 GTM
  • Status: 200 OK (Código de status HTTP)

HTTP Status Codes:
  • 1XX: Informational (100 a 199)
  • 2XX: Success
    • 200: Consulta encontrada no server
    • 201/202: Criação de novo recurso com sucesso
  • 3XX: Redirection
    • 300: Requisição HTTP foi entendida, mas o recurso encontra-se em outra URI
  • 4XX: Client Error
    • 404: URI informada incorretamente (Not Found)
    • 405 e 403: URI pode ser requisitada apenas com verbo GET/POST
  • 5XX: Server Error
    • 500: Requisição realizada, mas houve erro no lado do servidor (Server Error)

Segurança em APIs:

  • Uso de cache para requests: Cliente faz requisição ao servidor, que enviará a resposta e a armazenará em memória. As próximas requisições similares consultarão diretamente o cache, dispensando acesso ao servidor todas as vezes. O Redis é um exemplo de ferramenta que constrói tal estrutura.
  • Limitar quantidade de requests no servidor para evitar queda do mesmo.
  • Promover autenticação e autorização de acesso, aderindo Tokens, via Public Key enviada no Header da Request para autenticação e acesso ao servidor.
    • Authorization: What you can do
    • Authentication: Who are you

JWT:

JWT (JSON Web Token) é padrão (RFC 7519) de token stateless (geralmente do tipo Bearer token) usado para autenticação/autorização na troca de informações entre cliente e servidor (HTTP request/response) de forma segura (geralmente em conjunto com protocolo OAuth2), assinadas com Message Authentication Code (HMAC). Access Token é token de curta duração com expiração, usado para acessar recursos protegidos da API, enviado em cada request no header Authorization. Refresh Token é token de longa duração de expiração, usado apenas para gerar novos access tokens. Sua estrutura consiste em header (tipo de token e algoritmo de assinatura), payload (dados claims, como subject, issuedAt, expiration) e signature (assinatura criptográfica do header e payload usando secret key). JWT amplamente utilizado em sistemas web RESTful (arquitetura REST) stateless (sem manter estado no servidor), com funções encoder (criação) e decoder (leitura).

Request de usuário não autenticado será rejeitada (401 Unauthorized). Primeiramente, usuário regitra suas credenciais (/api/auth/register), depois acessa (/api/auth/login) para obter access token, para então acessar endpoints protegidos. Usuário pode gerar refresh token (/api/auth/refresh) quando o access token expirar. Por fim, usuário pode fazer logout (/api/auth/logout) com exclusão do refresh token.


Exemplo prático:

Em breve.

Elaborado por Mateus Schwede
ubsocial.github.io