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.
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'.
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:
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.
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
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 ;).
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