Harry Potter: Entendendo os Métodos HTTP

Introdução

Neste artigo iremos ver uma explicação sobre os métodos HTTP mais utilizados como o GET, POST, PUT, PATCH e DELETE fazendo uma analogia com alguns feitiços do universo de Harry Potter.

Conteúdo

Accio

"O Feitiço Convocatório, conhecido como Accio é usado para chamar itens de longa distância para as mãos do bruxo. Para usá-lo, deve-se apontar a varinha para o objeto e dizer Accio + Nome do objeto escolhido"

No HTTP o Accio é o método GET. Usamos ele para obter a representação de algo. Por exemplo, para obter os dados de determinado livro na biblioteca de Hogwarts podemos fazer a seguinte chamada no sistema:

REQUEST
METHOD: GET
URL: localhost:8080/livros/42

RESPONSE
{
    "id": 42,
    "nome": "Quadribol através dos séculos",
    "autor": "Kennilworthy Whisp"
}

Um poder que temos com o método GET que não temos no Accio é o de puxar mais de um item de uma só vez, como é o caso de usar o GET sem passar o ID do livro. Dessa forma, por convenção, entende-se que queremos trazer todos os livros da biblioteca:

REQUEST
METHOD: GET
URL: localhost:8080/livros

RESPONSE
[
    {
        "id": 42,
        "nome": "Quadribol através dos séculos",
        "autor": "Kennilworthy Whisp"
    },

    {
        "id": 66,
        "nome": "Animais Fantásticos e Onde Habitam",
        "autor": "Newt Scamander"
    },

    ... Mais e mais livros ...
]

Aguamenti

"O feitiço Aguamenti conjura água pura apartir da varinha do bruxo que o pronuncia. Dependendo da concentração e das intenções do lançador, esse feitiço pode ser qualquer coisa, desde um simples jato de água até uma onda"

No HTTP o Aguamenti é equivalente ao método POST que serve para criarmos qualquer coisa. No nosso exemplo temos um endpoint que aponta para o conteúdo de uma jarra que, conforme vemos abaixo, está vazia:

REQUEST
METHOD: GET
URL: localhost:8080/jarras/567/conteudo

RESPONSE
{}

Para colocarmos água dentro dessa jarra precisamos criá-la com seus devidos atributos e fazer um POST para a mesma URL (endpoint):

REQUEST
METHOD: POST 
CONTENT: {"quantidade":"500ml", "tipo":"Água"} 
URL: localhost:8080/jarras/567/conteudo

Ao chamar o GET novamente vemos que o conteúdo da jarra agora foi preenchido:

REQUEST
METHOD: GET 
URL: localhost:8080/jarras/567/conteudo

RESPONSE
{
    "id": 1,
    "quantidade": "500ml",
    "tipo": "Água"
}

Vera Verto

"Frase em latim que pode ser interpretada como 'Eu realmente troco'. É um encantamento que transforma animais em taças de cristal, um tipo de transformação clássico e altamente refinado. Os animais mais usados ​​para esse feitiço são pássaros, gatos e ratos"

No HTTP quando queremos alterar um recurso por completo chamamos o método PUT. Por exemplo, dado um determinado pássaro que tem atributos como "Cor", "Altura", "Peso" e "Superfície" queremos transformá-lo numa taça que possui os mesmos atributos mas com valores totalmente diferentes.

Vamos usar o GET para dar uma olhada nos atributos do passáro:

REQUEST
METHOD: GET
URL: localhost:8080/professores/minerva/materiais/47

RESPONSE
{
    "id": 47,
    "cor": "Preto e Branco",
    "altura": "63cm",
    "peso": "2kg",
    "superficie": "Penas"
}

E usando o PUT fazemos a transformação alterando todos os atributos:

REQUEST
METHOD: PUT
CONTENT: {"cor": "Transparente", "altura": "30cm", 
"peso", "85g", "superficie": "Vidro"}
URL: localhost:8080/professores/minerva/materiais/47

Ao chamar o GET novamente, vemos que o recurso de ID 47 está totalmente diferente:

REQUEST
METHOD: GET
URL: localhost:8080/professores/minerva/materiais/47

RESPONSE
{
    "id": 47,
    "cor": "Transparente",
    "altura": "30cm",
    "peso": "85g",
    "superficie": "Vidro"
}

Nota: O exemplo dado é totalmente viável na prática, mas se tratando de orientação a objetos, se hoje o seu código permite transformar um passáro numa taça muito provavelmente você abstraiu mais que o necessário.

Reparo

"O Feitiço de Reparação reparará objetos quebrados com um movimento da varinha. Acidentes acontecem, então é essencial saber como consertar nossos erros"

Diferente do método PUT que atualiza um recurso por completo o PATCH atualiza um recurso parcialmente, ou seja, alterando um ou mais atributos de forma separada.

Dado uma lista de óculos, podemos usar o GET para verificar a situação do óculos do Harry:

REQUEST
METHOD: GET 
URL: localhost:8080/alunos/harry-potter/oculos/123

RESPONSE
{
    "id": 123,
    "dono": "Harry Potter",
    "cor": "Preto",
    "armacao": "Redonda",
    "situacao": "Quebrado"
}

E logo após, o PATCH para executar a reparação:

REQUEST
METHOD: PATCH 
CONTENT: {"situacao":"Consertado"} 
URL: locahost:8080/alunos/harry-potter/oculos/123

E ao chamar o GET novamente, temos que o atributo "situacao" foi alterado de "Quebrado" para "Consertado":

REQUEST
METHOD: GET
URL: localhost:8080/alunos/harry-potter/oculos/123

RESPONSE
{
    "id": 123,
    "dono": "Harry Potter",
    "cor": "Preto",
    "armacao": "Redonda",
    "situacao": "Consertado"
}

Reducto

"Com esta maldição poderosa, bruxos habilidosos podem facilmente reduzir os obstáculos em pedaços. Por razões óbvias, muito cuidado deve ser exercido ao aprender e praticar este feitiço"

Simples de executar mas exige um cuidado especial. O DELETE do HTTP remove determinado recurso, geralmente através do ID do mesmo. Como exemplo, usaremos o DELETE para destruir uma Horcrux, embora o Reducto não tenha poder suficiente para fazê-lo.

Primeiro, usando o GET vamos atrás da Horcrux:

REQUEST
METHOD: GET
URL: localhost:8080/horcruxes/8

RESPONSE
{
    "id": 8,
    "tipo": "Nokia Tijolão",
    "local": "Osasco"
}

Para destruí-la (deletar), basta chamar a mesma URL passando o método DELETE:

REQUEST
METHOD: DELETE
URL: localhost:8080/horcruxes/8

Se chamarmos o GET novamente, nada será retornado, ou seja, a horcrux foi destruída!

REQUEST
METHOD: GET
URL: localhost:8080/horcruxes/8

RESPONSE
{}

Conclusão

Neste artigo aprendemos como são usados os métodos HTTP. Usamos o GET para buscar um livro na biblioteca de Hogwarts; POST para criar água e encher uma jarra; PUT para transformar um pássaro numa taça; PATCH para consertar o óculos de Harry e o DELETE para destruir uma Horcrux.

Esses métodos são muito importantes e bastante utilizados em aplicações WEB como APIs REST e sistemas de CRUD (Create, Read, Update, Delete). Há ainda outros métodos HTTP como o Head, Connect, Options e Trace que não foram explicados aqui, quem sabe num próximo artigo?

Até a próxima!
Malfeito feito...

Referências

21