Tutorial: Webservices em nodejs com Strongloop (2)
Os Web Services são muito úteis quando pretendemos desenvolver serviços e aplicações de grande escala/distribuídas… mas também para a interoperabilidade de sistemas.
Depois da instalação do nodejs e do Strongloop hoje vamos mostrar como pode criar um modelo de dados.
Com o nosso webservice criado vamos agora criar um modelo para que os utilizadores do webservice possam registar-se e fazer o login. Para isso vamos ao terminal e dentro da pasta do projeto escrevemos:
sudo slc loopback:model |
Ao executarmos este comando será apresentada um novo formulário:
- Introduzimos o nome do modelo, neste caso utilizadores.
- A opção seguinte pergunta-nos qual é o tipo de armazenamento que quermos fazer, como ainda não temos nenhuma base de dados escolhemos a opção db, que armazena os dados em memória.
- A opção seguinte temos de selecionar que tipo de modelo queremos, neste caso será do tipo user, isto quer dizer que o nosso modelo será baseado num modelo pré-construído User.
- Em seguida selecionamos se queremos que o modelo seja exposto no webservice, dizemos que sim.
- A opção seguinte permite-nos inserir o plural para o modelo, se carregarmos no enter inserimos a opção por defeito que é acrescentar mais um “s” no nome do modelo.
- Na opção seguinte selecionamos modelo comum (common).
Depois de esta fase vamos definir as propriedades do nosso modelo, neste caso vamos definir para o modelo utilizadores um username, email e uma password todos do tipo string e obrigatórios.
Neste momento com o comando seguinte já podemos ver no browser o nosso webservice a funcionar, mas apenas com o modelo utilizadores:
sudo node . |
Depois de executar este comando é mostrado algo como o que se pode ver na figura anterior e que nos indica que temos o webservice a funcionar no porto lógico 3000.
O explorer é uma ferramenta semelhante ao postman e que podemos usar para testar o webservice.
Para complementar o tutorial em seguida serão implementados mais dois modelos do tipo (PersistedModel), o modelo Marca e o modelo Telefone.
O modelo telefone não será exposto no webservice, em vez disso o modelo Marca terá uma propriedade que será um array com objectos do tipo Telefone, por outras palavras uma Marca pode ter vários telefones.
Corremos novamente o comando sudo node . e vamos usar o explorer para inserir alguns dados.
sudo node . |
No explorer vamos até ao POST/ Marcas e clicámos para abrir uma janela como a que vemos na figura seguinte:
No canto inferior direito podemos ver o nosso esquema do modelo, se der-mos um click em cima esse esquema será passado automaticamente para a caixa de parâmetros, onde poderá ser preenchido para poder ser executado, exemplo na figura seguinte.
Agora fazemos,”Try it Out”, click no botão no canto inferior esquerdo para executar-mos o POST.
Pronto os dados foram enviados com sucesso. Vamos agora executar um GET para vermos esses dados. Para isso vamos até ao GET/ Marcas e fazemos um “Try it Out”.
Podemos verificar que esta a tudo a funcionar bem, no entanto ainda existem problemas, um deles é o facto de que os dados estão a ser guardados em memória, o que significa que se pararmos a API perdemos todos os dados, para isto não acontecer vamos instalar o mongodb para guardarmos os dados. O segundo problema centra-se na questão de que qualquer pessoa pode aceder á API e fazer um GET ou um POST por exemplo, para isso não acontecer temos de controlar os acessos, iremos dar permissões para que apenas utilizadores que estão registados e que fizeram o login possam executar essas operações.
Vamos então fazer a instalação do mongodb:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list sudo apt update sudo apt install –y mongodb-org |
Para iniciar o serviço basta usar o seguinte comando:
sudo service mongod start |
Quisermos verificar se tudo correu bem e o mongodb está a correr:
sudo systemctl status mongodb.service |
Agora e com o mongodb instalado vamos criar um datasource no nosso webservice para associarmos os nossos modelos.
sudo slc loopback:datasource |
Depois de executarmos o comando anterior temos de preencher mais algumas questões, na primeira e como podemos ver na figura anterior da-mos um nome ao datasource, neste caso é MongoDB, depois temos de escolher o tipo de datasource que é o mongodb, em seguida temos de preencher as opções de host, no nosso caso como a base de dados foi instalada na mesma máquina dizemos que é o localhost, para a porta o mongodb por defeito corre na porta 27017, username e password foi deixado em branco mas não é aconselhável fazer isto, de seguida é perguntado se queremos instalar o ‘connector’ do mongodb dizemos que sim se não temos de o fazer a seguir manualmente.
Se tudo correu bem vemos algo parecido com o que se pode ver na figura seguinte
Agora temos de fazer algumas alterações no ficheiro de configuração dos modelos para isso executamos o seguinte comando:
sudo nano server/model-config.json |
Podemos ver que as propriedades datasource são db, temos de as alterar para o novo datasource que acabamos de criar, MongoDB, como podemos ver na figura seguinte.
Depois de iniciarmos novamente a API com o comando sudo node . se tentarmos fazer um GET ás Marcas verificamos que não existem dados, vamos então fazer novamente um POST para depois voltarmos a parar e ligar novamente a API e verificar se já conseguimos guardar os dados enviados para a API.
Agora que temos a nossa base de dados ligada á API vamos implementar os acessos de controlo, para isso executamos o comando:
sudo slc loopback:acl |
Nas perguntas que são feitas escolhemos todos os valores por defeito menos o ultimo que devemos escolher o que nega o acesso ‘Explicitly deny access’, neste momento se corrermos a API já não temos acesso a nada pois negamos o acesso a todos os modelos, todos métodos e propriedades, todos os tipos (CRUD) leitura, escrita, apagar e editar e a todos os utilizadores.
Mas não é exatamente isto que se pretende, o que se pretende é que os utlizadores registados e que tenham feito o log in possam aceder á API, para isso executamos novamente o comando:
sudo slc loopback:acl |
E damos permissões para que um utilizador que tenha feito o log in possa executar operações de leitura ás Marcas.
Agora com a API a correr vamos ao explorer e registamos um utilizador, para isso vamos fazer um POST no modelo utilizadores.
Pronto agora fazemos o “Try it Out” e temos um novo utilizador registado.
Recebemos a reposta a confirmar que o utilizador foi registado com sucesso.
E em seguida vamos fazer o login com as credenciais deste novo utilizador, para isso temos de fazer um POST em utilizadores/login, como mostra na figura seguinte.
Fazemos o “Try it Out” para obtermos uma resposta que contem o token que podemos usar para nos identificar na API.
Na figura pode ver-se na resposta que foi enviada existe uma propriedade “id” no objecto json, este é o token que pode ser usado para a API identificar o utilizador, para podermos usar e testar a API temos de o copiar e colar na caixa de texto do explorer no canto superior direito e fazer o set access token.
Pronto agora se fizermos novamente um GET às Marcas já conseguimos uma resposta com sucesso, mas se tentarmos o POST ou outra operação sem ser de leitura obteremos um erro de acesso pois não demos permissões para que isso seja feito.
Este artigo tem mais de um ano
Correr comandos com sudo não é muito aconselhável, tudo deveria funcionar sem sudo…
Não uso e não me faz falta nenhuma, mas um ENORME louvar ao António Marques por partilhar estes conhecimentos e se dar a tanto trabalho de fazer um tutorial fantástico. Parabéns!
Isto sim são bons artigos…
Obrigado António Marques.
Obrigado pela partilha deste excelente conteúdo.
http://www.samsung.com/global/galaxy/events/unpacked/
Boa tarde e antes de mais, um muito obrigado pela partilha.
Uma sugestão, colocar um tutorial para conectar a outra data source que não o MongoDB.
Mas parabéns pelo artigo.
Isso basta escolher quando aparece o datasource. É simples
no artigo esta
do slc loopback:model
deve ficar:
sudo slc loopback:model
Excelente artigo, o António está de parabéns!
isto serve para que mesmo?
Webservices/APIs
Só uma dica: é possível gravar dados no disco mesmo quando utilizamos o tipo de base de dados memory(connector) para tal basta acrescentarmos a linha “file”: “ficheiro.json” no ficheiro datasources.json
db”: {
“name”: “db”,
“connector”: “memory”,
“file”: “mydata.json”
}
Boa, obrigado.
Parabéns António Marques. Excelente tutorial, bem elaborado e elucidativo do Strongloop e mongoDB.