Dev (Back & Front)ARTIGO

Simulando uma API Restful – Parte 02

Neste artigo, vamos ver como podemos gerar uma massa de dados e interagir com uma interface, ao simular uma API Restful.

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:

card-api

No próximo artigo, vamos adicionar o ui-router e criar o HTML para editar e adicionar mais dados.

É desenvolver front end e designer mobile. Autor dos livros "HTML5 Responsive Table Design" e "Learning Single Page Web Application", trabalha atualmente full time com angularjs e é core member do Mastering Mean Time. Acompanhe no Twitter e GitHub @newaeonweb

Ver perfil