Representational State Transfer

Publicado em 30/11/2022

REST é um estilo de arquitetura criado por Roy Fielding no ano 2000 para sua tese de doutorado. A palavra REST é um acrônimo para: Representational State Transfer ou em bom português: Transferência Representacional de Estado.

Geralmente vemos o termo ser aplicado para o desenvolvimento de APIs, porém, por ser um estilo de arquitetura, REST pode ser aplicado a qualquer sistema em diferentes contextos.

O REST é formado por um conjunto de especificações, que tem por objetivo facilitar a comunicação entre diferentes sistemas. Quanto mais dessas especificações forem aplicadas mais REST será a aplicação, ou seja, ela será uma aplicação RESTful. As especificações definem que para ser RESTful a aplicação precisa ser:

  • Client-Server - separa a responsabilidade do backend e do frontend, ou seja, cada um deve trabalhar de forma independente.

  • Stateless - não pode manter estado da requisição. O servidor não deve guardar a sessão do cliente, ou seja, ao acessar um determinado recurso o cliente fornecerá todas as informações necessárias que garanta que ele tenha permissão para consumir o recurso solicitado. Ex. credenciais de acesso, tokens.

  • Cache - O servidor precisa informar ao cliente quando um recurso pode ser reutilizado.

  • Uniform Interface - Procura-se estabelecer padrões para a aplicação. Nesse ponto destaca-se a padronização de quatro sub-requisitos.

    • Identificação uniforme dos recursos.
    • Manipulação dos recursos através de representações, nesse caso não é o próprio recurso que será manipulado e sim a sua representação, como se fosse uma foto do que tem no server. Essa representação pode ser feita em diferentes formatos: JSON, XML, HTML, TXT entre outros.
    • Mensagens auto descritivas.
    • O uso de hypermedia para fazer a navegação entre os recursos. Um bom exemplo disso é a própria web, quando fazemos uma navegação através de links que nos levam de uma página a outra.
  • Layered System - A arquitetura será construída em camadas, onde cada componente não pode ver além da camada com a qual está a interagir, ou em outras palavras, o cliente não precisa saber quais são os processos executados quando ele acessa um determinado recurso.

  • Code-On-Demand - Pode ser definido como a capacidade do cliente baixar e executar códigos do seu lado.