No artigo anterior, criamos um simples arquivo JSON para simular nosso banco de dados. Neste artigo, vamos ver como podemos gerar uma massa de dados e interagir com uma interface.
Instalando as ferramentas necessárias
Abra seu Terminal/Shell e digite:
npm install faker underscore
Vamos utilizar o faker para gerar nossos dados e o underscore em nossa função. Você encontra mais informações sobre o faker aqui. Com ele, você pode gerar todo tipo de dado – endereços, imagens, datas, entre outras coisas.
Criando o arquivo gerador da API
Continuando com a mesma pasta do exemplo anterior, vamos criar o arquivo que vai gerar nossa API.
Dentro dessa pasta, crie um arquivo chamado fakerdb.json e insira o seguinte código:
module.exports = function() { var faker = require('faker'); var _ = require('underscore'); return { band: _.times(10, function (number) { return { id: number, name: faker.random.arrayElement(["Ozzy", "Metallica", "Rush", "Marillion"]), description: faker.lorem.paragraph(), active: true, picture: faker.image.imageUrl('g','350','150') } }) } }
Note que a função times() determina a quantidade de registro que vamos gerar – nesse exemplo 10, mas você pode passar o quanto quiser.
Iniciando o servidor
Agora, vamos iniciar o servidor e ver o resultado.
Abra seu Terminal/Shell e digite:
json-server fakerdb.json
Abra seu navegador e acesse a url localhost:3000/band.
Você vai ver o resultado abaixo:
[{ "id": 0, "name": "Marillion", "description": "Non voluptas quam voluptas voluptate.\nSit expedita dolores voluptas voluptas harum minus.\nEaque magnam rerum cum.\nId aspernatur et.\nEius quo voluptas.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 1, "name": "Ozzy", "description": "Commodi eaque nulla molestiae dolore omnis dicta.\nSunt nihil doloribus quo dolor et.\nOmnis voluptatum unde porro officia nobis.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 2, "name": "Marillion", "description": "Ut consectetur mollitia.\nVelit laboriosam aut mollitia quidem voluptas.\nQuam voluptatem earum harum ea qui veniam eum aut.\nAsperiores non reprehenderit ut.\nConsequatur ut impedit sit harum.\nPossimus et corporis necessitatibus dolor eveniet odio quia.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 3, "name": "Ozzy", "description": "Quia voluptatum et esse.\nDolorum quia a est voluptatem.\nOptio consequatur eos excepturi fugiat.\nEst rem qui iste nesciunt eius quis omnis explicabo.\nConsequatur nemo culpa placeat.\nFuga minus fugiat et animi dolores magnam temporibus delectus aperiam.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 4, "name": "Ozzy", "description": "Eligendi quo at.\nOmnis nobis perspiciatis a eum accusantium qui.\nDolorum optio nostrum.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 5, "name": "Marillion", "description": "Deserunt aut voluptatibus ex fuga placeat inventore veniam sint.\nSunt voluptate voluptas nobis sapiente et.\nDolores quia ab officiis ut molestias.\nEaque quis quibusdam vel qui.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 6, "name": "Metallica", "description": "Molestiae autem assumenda ut sit doloremque eligendi voluptas dolorum consequatur.\nCorrupti impedit numquam ut eum rerum placeat.\nMollitia possimus consequatur quod ab dolores excepturi corporis numquam.\nNecessitatibus ullam aut eum.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 7, "name": "Rush", "description": "Necessitatibus ut et culpa corporis quam.\nAdipisci earum est nam veritatis sed dolore.\nFuga assumenda dolor commodi enim repellendus enim doloremque.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 8, "name": "Rush", "description": "Assumenda impedit aut accusantium rerum sit possimus.\nVoluptatem inventore et.\nIusto tempora est distinctio sit nostrum vitae omnis quibusdam.\nIn quisquam velit commodi quae sed.\nId fuga et fugiat est tenetur quasi.", "active": true, "picture": "http://lorempixel.com/g/350/150" }, { "id": 9, "name": "Metallica", "description": "Sed omnis enim cum illo laboriosam enim laborum sit facilis.\nLibero quidem culpa inventore.\nVoluptatum necessitatibus iste temporibus modi est.\nEaque totam quibusdam.\nEarum et sit doloremque dolores vel similique aliquam.", "active": true, "picture": "http://lorempixel.com/g/350/150" }]
Pronto, agora você pode facilmente interagir com essa API e criar o seu front end.
Utilizando AngularJS para consumir a API
Vamos utilizar AngularJS para criar nossa aplicação, e aproveitar a facilidade do json-server para criar um HTML e consumir os dados da API.
No diretório raiz, crie um arquivo HTML e utilize o código abaixo:
<!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>AngularJS API</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- cdnjs --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script> </head> <body ng-app="api"> <!--[if lt IE 8]> <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p> <![endif]--> <!-- Add your site or application content here --> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular-animate.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular-resource.min.js"></script> <script src="js/main.js"></script> </body> </html>
Feito isso, vamos criar nosso arquivo JS. Crie um diretório chamado JS e, dentro dele, um arquivo mais.js com o código abaixo:
(function () { 'use strict' angular .module('api', ['ngResource']) .factory('apiService', apiService) .controller('getBands', getBands); apiService.$inject = ['$resource']; function apiService($resource) { return $resource('./band/:bandId', { bandId: '@bandId' }, { get: { method: 'GET', isArray: false }, update: { method: 'PUT' } }) } getBands.$inject = ['apiService']; function getBands(apiService) { var vm = this; vm.listBands = apiService.query(); } })();
Note que, por ser um exemplo básico, estou utilizando tudo no mesmo arquivo. Não faça isso em produção.
Agora vamos adicionar o código HTML para renderizar os dados da API. Utilize o código abaixo e insira logo após o comentário do arquivo index.html.
<div class="container" ng-controller="getBands as vm"> <p>Consumindo a API</p> <div class="card card-block" ng-repeat="item in vm.listBands"> <img class="card-img-top" ng-src="" alt=""> <div class="card-block"> <h4 class="card-title"></h4> <p class="card-text"></p> <a href="band/" class="btn btn-primary">Editar</a> </div> </div> </div>
O resultado pode ser visto em http://localhost:3000/, conforme a imagem abaixo:
No próximo artigo, vamos adicionar o ui-router e criar o HTML para editar e adicionar mais dados.