Definindo os termos REST e RESTful

Introdução

Faala pessoal! Tudo beleza?

Nesse post eu tento trazer de forma clara e objetiva as diferenças e particularidades dos termos REST e RESTful, que podem ser uma dor de cabeça para que está inserido no mundo das API's e requisições HTTP.

Para isso, devemos 'começar pelo começo', e ter bem definidos alguns conceitos essencias referentes à este tema: são as API's e requisições HTTP.

O que são API's e requisições HTTP?

API é a sigla para Application Programming Interface (Interface de Programação de Aplicação), e, de forma sintetizada, representa um conjunto de bibliotecas formadas por métodos, funções e objetos que permitem a integração de uma aplicação com outras aplicações externas. É basicamente um conjunto de requisições que permite a comunicação de dados entre aplicações.

Já o HTTP, sigla para Hypertext Transfer Protocol (Protocolo de transferência de Hipertexto), é a base para a comunicação de dados da World Wide Web, sendo ele um protocolo de comunicação entre sistemas de informação que permite a transferência de dados entre redes de computadores. É a partir deste protocolo, por exemplo, que ocorre a obtenção de recursos na Web, tais como documentos HTML.

O HTTP é um protocolo cliente-servidor, ou seja, nele as requisições são iniciadas pelo destinatário, geralmente um navegador da Web. Dado que o HTTP trabalha com documentos web, é importante entender que um documento web completo é reconstruído a partir dos diferentes sub-documentos obtidos, como por exemplo texto, descrição do layout, imagens, vídeos, scripts e muito mais.

Caso você se interesse e queira saber mais sobre esse protocolo, nós temos outro post aqui na Coday que explica de forma mais detalhada o funcionamento de requisições HTTP, basta que você pesquise por 'Como funcionam as requisições HTTP'.

Definindo o termo REST

Agora que você já tem um breve entedimento sobre API's e requisições HTTP, vamos para a definição do primeiro termo: REST.

REST é a sigla para a Representational State Transfer (Transferência de Estado Representacional), e representa uma abstração da arquitetura da World Wide Web. Esse estilo arquitetural foi proposto por Roy Thomas Fielding, em 2000, e nada mais é que um padrão de arquitetura para criar serviços e disponibilizá-los na Web.

De forma suscinta, o REST consiste em princípios/regras/constraints que, quando seguidas, permitem a criação de um projeto com interfaces bem definidas. Além disso, o REST ignora os detalhes da implementação de componente e a sintaxe de protocolo com o objetivo de focar nos papéis dos componentes, nas restrições sobre sua interação com outros componentes e na sua interpretação de elementos de dados significantes.

Roy Fielding classificou um serviço REST com algumas características específicas, sendo algumas delas:

  • Cliente-Servidor: a comunicação ocorre entre dois agentes, em rede, onde um agente é considerado cliente e outro é considerado servidor. O cliente, ativamente, faz requisições que devem ser respondidas pelo servidor.
  • Cache: as respostas do servidor devem determinar se aquela informação pode entrar ou não em um cache. Assim o cliente pode confiar se aquela resposta pode ser usada novamente em uma requisição equivalente.
  • Stateless: o agente servidor não deverá manter nenhum tipo de estado entre duas ou mais requisições. Uma única requisição deve conter todos os parâmetros necessários para ser atendida sem ter de contar com nenhum tipo de “memória” do agente servidor.
  • Layered: A comunicação entre cliente e servidor deve ocorrer através de camadas (arquitetura pipe-and-filter). Onde camadas podem ser adicionadas para melhorar a performance do sistema (por exemplo, implementando caching).
  • Interface Uniforme: a troca de mensagens entre cliente e servidor deve ocorrer através de interfaces uniformes, ou assemelhadas, tanto em modo quanto em formato.

O próprio Fielding indica que o REST não deva se restringir a um protocolo, e tão pouco a um formato específico. Sendo assim, o REST não deve necessariamente envolver HTTP, XML ou JSON.

Defindo o termo RESTful

Basicamente, RESTful refere-se a capacidade de determinado sistema aplicar os princípios de REST. Isso significa que, mesmo utilizando o mesmo design, seu comportamento irá mudar de acordo com a maneira que é consumido, como exemplo, qual a requisição utilizada para trabalhar sobre a API.

Conforme as indicações de Fielding, uma API pode ser entedida como RESTful quando implementada seguindo os cinco princípios fundamentais do REST.

Pesquisando sobre o termo, encontrei um exemplo no Stack Overflow que vem muito a calhar para o entendimento deste assunto, e vou deixá-lo logo abaixo (todos os links estarão disponíveis nas referências):

Por exemplo, temos a URL (endpoint) abaixo: http://www.contoso.com/alunos

Se queremos trazer a lista de alunos, basta realizamos uma requisição GET:

Request:
[GET] http://www.contoso.com/alunos
Body: empty

A resposta será algo como:

Response:
HTTP Code 200 OK
[
    { id: 1, nome: "Thiago Lunardi" },
    { id: 2, nome: "Joe Satriani"}
]

Mas, se eu quiser adicionar um novo aluno, uso o mesmo design, mas consumindo de outra forma, com requisição POST:

Request:
[POST] http://www.contoso.com/alunos
Body: { "nome: "Slash" }

HTTP Code 201 Created
{ id: 3, nome: "Slash" }

Continuando, para saber mais detalhes sobre um aluno:

Request:
[GET] http://www.contoso.com/alunos/1
Body: empty

Response:
HTTP Code 200 OK
{
    id: 1,
    nome: "Thiago Lunardi",
    github: "https://github.com/ThiagoLunardi",
    website: "http://thiagolunardi.net",
    blog: "https://medium.com/@thiagolunardi",
}

Para atualizar informações de um ano, da mesma forma, usamos o mesmo design, e apenas mudamos a forma de consumir o recurso, e ele terá um comportamento diferente:

Request:
[PUT] http://www.contoso.com/alunos/1
Body: { "twitter": "@thiagolunardi13" }

Response:
HTTP Code 200 OK
{
    id: 1,
    nome: "Thiago Lunardi",
    github: "https://github.com/ThiagoLunardi",
    website: "http://thiagolunardi.net",
    blog: "https://medium.com/@thiagolunardi",
    twitter: "@thiagolunardi13"
}

Para excluir:

Request:
[DELETE] http://www.contoso.com/alunos/1
Body: empty

Response:
HTTP Code 204 No Content

Conclusão

Estes termos muitas vezes podem causar certa confusão, mas no fim você descobre que não há mistério com relação aos mesmos, basta uma análise realizada com calma.

Espero ter ajudado à clarear suas ideias sobre este assunto. Qualquer dúvida, sugestão ou crítica é sempre bem-vinda, basta que você deixe aqui nos comentários ;).

Referências

Stack Overflow - O que é REST e RESTful: https://pt.stackoverflow.com/questions/45783/o-que-%C3%A9-rest-e-restful

EximiaCo.tech - Desmistificando REST: https://www.eximiaco.tech/pt/2019/09/13/origem-e-significado-de-rest-e-restful/

Becode - O que é API? REST e RESTful? Conheça as definições e diferenças!: https://becode.com.br/o-que-e-api-rest-e-restful/

Dissertação sobre REST - Roy Fielding: https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

Comentários