A Saga do Vapor parte 1

Ramón Dias
9 min readAug 3, 2020

Um guia prático de Vapor, feito por um estudante preguiçoso.

Introdução

Faz um tempo desde que escrevi aqui, mas cá estou de novo.

Recentemente eu construí um site com um chat para uma matéria da faculdade. Eu deveria desenvolver uma aplicação web e eu escolhi fazer um chat porque realmente adoro chats. Sempre me pego pensando como chats são feitos. Enfim, meu chat foi inicialmente construído com React.js e Node.js. Dois frameworks que eu nunca trabalhei antes, mas foi divertido. Eu sou do mundo do Swift, e esta foi a primeira vez trabalhando com o mundo do Javascript. No entanto, um dos objetivos da minha matéria era criar algo com Java Web, então mudei o backend para Java, e mantive o frontend com React.js.

Uma coisa estava estranha para mim: eu realmente não gostei como eu tive que mudar a linguagem que eu estava trabalhando. Eu gastei mais tempo tentando conectar tudo do que realmente fazendo algum progresso. Minha cabeça dói só de lembrar como fiquei mudando o tempo todo o mindset de Javascript para Java. Alguns podem gostar, eu não gostei. Quando estava construindo tudo com Javascript, era como se tudo se conectasse bem e parecesse tudo muito certo.

Então, como um cara do Swift, eu me perguntei:

O Swift tem alguma coisa parecida para APIs e/ou Servidores?

Felizmente, existe! É o Vapor.

Eu comecei minha pesquisa com o livro do Ray Wenderlich: Server Side Swift with Vapor. Eu tenho vivido o mundo do Swift já faz um tempo, até publiquei alguns apps na AppStore, eu não sou familiarizado com todo framework e biblioteca como eu gostaria. Então, por que não dar uma chance ao Vapor e ver se seria tão divertido quanto o Node.js quando integrado com React.js.

Portanto, como uma maneira de registrar tudo que estou aprendendo. Eu decidi fazer este guia. Talvez algumas pessoas achem ele útil, outros não, mas está tudo bem enquanto sirva para o propósito de ensinar alguém sobre Vapor e me manter estimulado a aprender. Eu espero que você goste.

Mãos à obra!

Eu vou começar bem do início. A partir da instalação do Vapor a alguns métodos HTTP, se você já tiver instalado e estiver acostumado com o projeto inicial, você pode pular para a próxima seção.

Abra seu terminal (Eu estou usando o iTerm, você pode usar o terminal nativo, ou qualquer coisa que goste).

Escreve este comando no seu terminal (ou copie e cole):

brew install vapor/tap/vapor

Este comando vai instalar o Vapor no seu computador. Após isso, você pode criar uma pasta que você usará para armazenar seus projetos. Chame do que quiser. Então, abra esta pasta no seu terminal. Abaixo estão os comandos que fazem esses passos através do terminal.

mkdir ~/vapor

cd ~/vapor

O primeiro está criando no diretório raiz uma pasta chamada 'vapor'. O último está trocando o seu diretório para a pasta chamada 'vapor'. Apenas repetindo, porque adoro os detalhes: você pode mudar o nome e colocar ela para o que quiser e onde quiser.

Abaixo está o comando que vai criar um novo projeto do Vapor.

vapor new VaporFirstStep -n

Eu fico pensando se você se perguntou: o que é esse -n? Esta é uma flag que responderá não para qualquer questão que possa aparecer durante a criação do projeto de Vapor.
Se tudo correr bem, essa tela aparecerá para você:

Screen that should be showed to you, if everything went OK.

Certo, vamos dar uma olhada dentro deste projeto.

cd VaporFirstStep (Eu acredito que você já sabe o que esse comando cd faz)

Não vou explicar sobre a estrutura das pastas e sobre o Swift Package Manager (SPM). Mas, se você quiser aprender mais sobre, dê uma olhada neste link para a estrutura das pastas e este link para o SPM, é a documentação oficial do Vapor.

Digite vapor Xcode para abrir o projeto no Xcode. Então, espere o Xcode terminar de buscar os pacotes.

Vamos dar a primeira olhada no Xcode.

Lindo, não é mesmo?

Abra o arquivo indicado pela seta vermelha. Aqui estão alguns métodos GET padrão que você pode fazer a requisição no seu navegador.

Compile e rode o seu projeto (Tenha certeza que o dispositivo selecionado é o My Mac. No print do meu Xcode está marcado como iPhone, mas, ao invés disso, deveria ser My Mac). Espere, espere, espeeeeere, e nada aconteceu.

Seu servidor está rodando, mas não há interface alguma para mostrar. Abra o navegador (Estarei usando o Google Chrome apenas para o guia, sou gosto mais do Safari).

Navegue para http://localhost/8080 (8080 é a porta usada pelo Vapor). Você verá isto:

Funciona!

Se você navegar para http://localhost:8080/hello o Vapor vai dizer olá para você.

Neste momento, você usou os dois métodos GET que estavam no seu projeto. Se é a primeira vez vendo métodos HTTP, mas você conhece o CRUD. Aqui está uma tabela que relaciona métodos HTTP ao CRUD, é da Wikipédia, mas encaixa perfeitamente para uma explicação bem, bem, bem rápida.

CRUD methods relation to HTTP methods, and some other methods too — Resource took from: Wikipedia

Métodos GET

Métodos GET são interessantes para ler dados da API (este termo se encaixa bem com o que estamos fazendo, estão vou chamá-lo assim), com ele você consegue pedir algum dado e receber como resposta um JSON. Nós não receberemos JSON como resposta agora, apenas nos métodos POST, mas garanto que você poderá adicionar isto depois. Eu vou usar respostas padrão para o retorno, ou parte padrão e parte customizada nos métodos GET.

É hora meu amigo, o momento de construir o nosso primeiro método GET customizado (por hora, eu usaria os Gists do Github para colar o meu código aqui). Vamos começar devagar, vou adicionar outra rota ao caminho anterior, este retornará outra frase.

Adicione esta função abaixo das duas anteriores. Então, compile e rode. Agora, para acessar este método você precisar digitar esta URL:

http://localhost:8080/hello/medium

Aqui está a resposta do nosso método GET. Então toda string que você adicionar como parâmetro ao seu método, é outra rota que você cria para a sua API.

Você pode estar pensando:

Como vou criar rotas dinâmicas?

Vamos ver como faz isso.

Novamente, adicione esta função abaixo do último método. Esta função deveria receber um nome como parâmetro e mostrar o nome passado pelo caminho da URL, além de mostrá-lo.

Esta é a saída:

E números então? Claro que você pode passar números.

Digite ou copie e cole isto abaixo da última função:

Se você está familiarizado com o Swift, você deve saber o que é o guard let. Para aqueles que não estão, o guard let assegura que um número vai ser recebido, se não receber, a requisição é abortada retornando um erro. Se você quiser saber mais informações sobre o guard let, dê uma olhada neste link.

Esta saída é mostrada se você passa um inteiro como parâmetro. Tudo está funcionando como esperado.

E este aqui vai ser mostrado se você passar uma string como parâmetro. Uma resposta em JSON com o erro.

Antes de começar os métodos POST, o Vapor tem outra maneira de implementar métodos HTTP. Eu não vou explorar eles, mas se você está curioso, vou mostrar a forma alternativa do método GET e no final da seção do método POST a forma alternativa do método POST.

Essa é a saída.

A saída não é diferente de antes.

Métodos POST

Métodos GET são divertidos, mas deveríamos interagir com nossa API mandando dados para ela. E por que não receber dados dela também? Então, mais divertido que receber dados, é enviar dados. Mais divertido que isso, é receber dados da API, quando você enviou dados. Mais divertido que isso, é enviar dados… Ok, chega disso.

Apenas para lembrar, GET é para leitura e POST é para escrita. Nós devemos começar a enviar dados para nossa API. Depois, veremos como enviar dados e receber uma resposta em JSON.

Mas antes: como eu envio dados para minha API? Atualmente, eu consigo abrir o endereço localhost através do meu navegador, vê que lá tem um caminho, que responde minha requisição. Eu mudo minha pergunta para: como eu envio dados para a minha API através do navegador? Se você procurar na internet, você pode conseguir achar um jeito ou outro de fazer isso. Eu fiz uma rápida pesquisa no Google e esse é o resultado que apareceu: link. Neste link, você encontrará várias respostas diferentes. No entanto, eu não vou usar o navegador para fazer requisições do tipo POST. Eu vou usar um programa que fará as requisições para a nossa API.

Para esta seção, para testar os retornos dos métodos POST, usarei o Insomnia. Você pode usar o Postman ou qualquer coisa que você quiser. JSON será usado para comunicação, então você precisa criar uma estrutura que será usada para receber os dados e enviar os dados.

Tenha certeza de adicionar essas duas structs no seu código.

Realmente, elas são bem simples. No entanto, elas ajudarão na transformação daquele JSON em alguma coisa que o Swift consegue entender. Além disso, você pode usar essas structs dentro da sua API como qualquer struct que você já conhece.

This is the function that will be added below the last functions. This is our first POST method! Hurray!

Essa função vai ser adicionada abaixo da última função. Esse é o nosso primeiro método POST! Viva! 🎉

Aqui está a entrada e saída no Insomnia.

Note que nós enviamos pelo mesmo caminho um hello para a nossa API. Talvez você esteja se perguntando:

Não deveria retornar 'Hello, world?' Como foi no primeiro método GET.

Negativo, as requisições são diferentes. Quando você faz uma requisição GET, nossa API irá responder de uma maneira, quando você faz uma requisição POST, nossa API irá responder de outra maneira.

Isso não é tudo, você pode receber um JSON como resposta também. Isto é interessante se você quer lidar com uma resposta em forma de dado dentro de uma aplicação que consome sua API.

Apenas adicione essa função abaixo da última.

A entrada e saída será:

Para encerrar este capítulo da nossa jornada, aqui você consegue ver o jeito diferente de fazer o método POST. Tudo funcionará como antes.

Agora você tem o poder de construir uma API bem simples que recebe requisições GET e POST, em outras palavras, uma API que você consegue interagir com ela. Isso é muito legal!

Encerramento

Eu não sei quantas partes serão, mas espero que consiga ensinar alguma coisa sobre tudo. E se você tiver sugestões ou dúvidas, você pode me mandar uma mensagem. Eu ficarei feliz de responder.

Eu espero que tenha gostado até então. Obrigado por ler e até a próxima!

--

--

Ramón Dias

iOS Developer, Computer Science Student at Universidade Católica de Brasília — UCB, sometimes I’m a Game Developer