text:
# Node.js - Aula 03 - Exercício

**Autor:** Wendell Adriel Luiz Silva - [WendellAdriel](https://github.com/WendellAdriel)
**Data:** 1455144837454

## Por que quando requisitamos ao nosso servidor de Query String, com o Chrome, ele executa 2 requisições, sendo a última "vazia"?

A segunda requisição que o **Chrome** envia é para trazer o `favicon.ico` da aplicação.

## Qual a DIFERENÇA entre o GET e o POST?

- **`GET`**
    - Todas informações são enviadas anexadas à `URL`
    - Há um limite máximo de caracteres que podem ser enviados
    - Dados enviados ficam guardados no `cache` do navegador
    - A mensagem é enviada apenas como uma `string`
- **`POST`**
    - Todas informações são enviadas junto ao corpo da requisição `HTTP`, protegendo para que os dados não sejam vistos na `URL`
    - Não há um limite de caracteres que podem ser enviados
    - Os dados enviados não ficam guardados no `cache` do navegador
    - Pode enviar outros tipos de dados além de `string`

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

```
postData name=Wendell%20Adriel&type=student
Tamanho do postData 34
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"83","etag":"W/\"53-FJJpQe0EvnaiYkm2MUIbNQ\"","date":"Wed, 10 Feb 2016 23:06:28 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Wendell Adriel","type":"student","_id":"56bbc27482124e110077f541"}
```

```
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-vTjX0L3EIPEGcUjU9U3wNg\"","date":"Wed, 10 Feb 2016 23:09:16 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6249803432933195777","electionId":"565e25d106dca622271891c4"}}
```

## Depois faça o DELETE, criando o script para tal, colocando aqui a resposta.

```
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Wed, 10 Feb 2016 23:13:59 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma API externa e crie um script para fazer um GET nela mostrando o resultado com HTML.

```js
// Chamada para API
'use strict';

const http = require('http');

http.get({
  hostname : 'pokeapi.co'
, path     : '/api/v2/pokemon/212/'
, agent    : false
}, res => {
  let data = '';
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  res.on('data', chunk => {
    data += chunk;
  });

  res.on('end', () => {
    let json = JSON.parse(data);
    console.log('<h1>' + json.id + ' - ' + json.name + '</h1>');
  });
});

// RESPOSTA
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Wed, 10 Feb 2016 23:39:43 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Cookie","x-frame-options":"SAMEORIGIN","allow":"GET, HEAD, OPTIONS"}
<h1>212 - scizor</h1>
```


text:
# Node.js - Aula 03 - Exercício
**Autor:** Rafael Crispim Ignácio

**Data:** 1451440020307

## Por que quando requisitamos ao nosso servidor de Query String, com o Chrome, ele executa 2 requisições, sendo a última "vazia"?
Quando executamos uma requisição através do navegador Google Chrome, o mesmo efetua uma requisição adicional buscando pela imagem favicon.ico.

## Qual a DIFERENÇA entre o GET e o POST?
As principais diferenças entre GET e POST são:
- Visibilidade

Enquanto uma requisição GET é enviada no formato de string anexada a URL uma requisição POST é anexada ao corpo do da requisição HTTP.
- Tamanho

As requisições GET, por serem em formato de String, estão limitadas a 255 caracteres já via POST este limite não existe.
- Dados

As requisições GET só podem transitar no padrão ASCII. No POST podemos utilizar do formato UCS, para isto basta utilizar o `enctype` igual a `multipart/form-data`. Além desta questão nas requisições GET podemos enviar informações no formato de texto enquanto no POST também podemos enviar dados binários.

É importante ressaltar que as duas formas são essenciais para enviarmos informações através do protocolo HTTP, cada qual tem a sua finalidade e objetivo.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github, colocando aqui a resposta de cada passo.
### CREATE

```js
node nodejs/exercicio.js
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"90","etag":"W/\"5a-JSlAXH/uFT9RSDVuDrebeQ\"","date":"Wed, 30 Dec 2015 01:25:34 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Rafael Crispim Ignácio","type":"Aluno","_id":"5683328e4bcde71100eaa9ee"}
```

### UPDATE

```js
node nodejs/exercicio.js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-lHgQ2Bma/0EhCuM+Yp8YVA\"","date":"Wed, 30 Dec 2015 01:26:47 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6233882208210255873","electionId":"565e25d106dca622271891c4"}}
```

## Depois faça o DELETE, criando o script para tal, colocando aqui a resposta.

```js
node nodejs/exercicio.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Wed, 30 Dec 2015 01:27:37 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma API externa e crie um script para fazer um GET nela mostrando o resultado com HTML.
- API

[http://pokeapi.co](http://pokeapi.co)

```js
// URL -> http://pokeapi.co/api/v1/pokemon/50
node nodejs/exercicio.js
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Wed, 30 Dec 2015 01:44:03 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Accept","x-frame-options":"SAMEORIGIN","cache-control":"s-maxage=360, max-age=360"}
Resposta:  {"abilities": [{"name": "sand-veil", "resource_uri": "/api/v1/ability/8/"}, {"name": "arena-trap", "resource_uri": "/api/v1/ability/71/"}, {"name": "sand-force", "resource_uri": "/api/v1/ability/159/"}], "attack": 55, "catch_rate": 0, "created": "2013-11-03T15:05:41.365518", "defense": 25, "descriptions": [{"name": "diglett_gen_1", "resource_uri": "/api/v1/description/801/"}, {"name": "diglett_gen_1", "resource_uri": "/api/v1/description/798/"}, {"name": "diglett_gen_1", "resource_uri": "/api/v1/description/799/"}, {"name": "diglett_gen_1", "resource_uri": "/api/v1/description/800/"}, {"name": "diglett_gen_1", "resource_uri": "/api/v1/description/802/"}, {"name": "diglett_gen_2", "resource_uri": "/api/v1/description/804/"}, {"name": "diglett_gen_3", "resource_uri": "/api/v1/description/805/"}, {"name": "diglett_gen_3", "resource_uri": "/api/v1/description/806/"}, {"name": "diglett_gen_3", "resource_uri": "/api/v1/description/807/"}, {"name": "diglett_gen_6", "resource_uri": "/api/v1/description/812/"}, {"name": "diglett_gen_6", "resource_uri": "/api/v1/description/813/"}, {"name": "diglett_gen_4", "resource_uri": "/api/v1/description/808/"}, {"name": "diglett_gen_5", "resource_uri": "/api/v1/description/811/"}, {"name": "diglett_gen_4", "resource_uri": "/api/v1/description/809/"}, {"name": "diglett_gen_2", "resource_uri": "/api/v1/description/803/"}, {"name": "diglett_gen_4", "resource_uri": "/api/v1/description/810/"}], "egg_cycles": 0, "egg_groups": [{"name": "Ground", "resource_uri": "/api/v1/egg/5/"}], "ev_yield": "", "evolutions": [{"level": 26, "method": "level_up", "resource_uri": "/api/v1/pokemon/51/", "to": "Dugtrio"}], "exp": 53, "growth_rate": "", "happiness": 0, "height": "2", "hp": 10, "male_female_ratio": "", "modified": "2013-11-23T13:13:25.213302", "moves": [{"learn_type": "level up", "level": 18, "name": "Bulldoze", "resource_uri": "/api/v1/move/523/"}, {"learn_type": "egg move", "name": "Final-gambit", "resource_uri": "/api/v1/move/515/"}, {"learn_type": "machine", "name": "Echoed-voice", "resource_uri": "/api/v1/move/497/"}, {"learn_type": "machine", "name": "Round", "resource_uri": "/api/v1/move/496/"}, {"learn_type": "machine", "name": "Hone-claws", "resource_uri": "/api/v1/move/468/"}, {"learn_type": "egg move", "name": "Memento", "resource_uri": "/api/v1/move/262/"}, {"learn_type": "egg move", "name": "Headbutt", "resource_uri": "/api/v1/move/29/"}, {"learn_type": "egg move", "name": "Reversal", "resource_uri": "/api/v1/move/179/"}, {"learn_type": "machine", "name": "Stealth-rock", "resource_uri": "/api/v1/move/446/"}, {"learn_type": "machine", "name": "Captivate", "resource_uri": "/api/v1/move/445/"}, {"learn_type": "level up", "level": 29, "name": "Mud-bomb", "resource_uri": "/api/v1/move/426/"}, {"learn_type": "machine", "name": "Shadow-claw", "resource_uri": "/api/v1/move/421/"}, {"learn_type": "level up", "level": 26, "name": "Earth-power", "resource_uri": "/api/v1/move/414/"}, {"learn_type": "level up", "level": 23, "name": "Sucker-punch", "resource_uri": "/api/v1/move/389/"}, {"learn_type": "machine", "name": "Natural-gift", "resource_uri": "/api/v1/move/363/"}, {"learn_type": "level up", "level": 7, "name": "Astonish", "resource_uri": "/api/v1/move/310/"}, {"learn_type": "machine", "name": "Sandstorm", "resource_uri": "/api/v1/move/201/"}, {"learn_type": "level up", "level": 21, "name": "Fury-swipes", "resource_uri": "/api/v1/move/154/"}, {"learn_type": "machine", "name": "Aerial-ace", "resource_uri": "/api/v1/move/332/"}, {"learn_type": "machine", "name": "Rock-tomb", "resource_uri": "/api/v1/move/317/"}, {"learn_type": "machine", "name": "Secret-power", "resource_uri": "/api/v1/move/290/"}, {"learn_type": "machine", "name": "Facade", "resource_uri": "/api/v1/move/263/"}, {"learn_type": "egg move", "name": "Uproar", "resource_uri": "/api/v1/move/253/"}, {"learn_type": "egg move", "name": "Beat-up", "resource_uri": "/api/v1/move/251/"}, {"learn_type": "machine", "name": "Rock-smash", "resource_uri": "/api/v1/move/249/"}, {"learn_type": "egg move", "name": "Ancientpower", "resource_uri": "/api/v1/move/246/"}, {"learn_type": "machine", "name": "Sunny-day", "resource_uri": "/api/v1/move/241/"}, {"learn_type": "machine", "name": "Hidden-power", "resource_uri": "/api/v1/move/237/"}, {"learn_type": "egg move", "name": "Pursuit", "resource_uri": "/api/v1/move/228/"}, {"learn_type": "level up", "level": 9, "name": "Magnitude", "resource_uri": "/api/v1/move/222/"}, {"learn_type": "machine", "name": "Frustration", "resource_uri": "/api/v1/move/218/"}, {"learn_type": "machine", "name": "Return", "resource_uri": "/api/v1/move/216/"}, {"learn_type": "machine", "name": "Sleep-talk", "resource_uri": "/api/v1/move/214/"}, {"learn_type": "machine", "name": "Attract", "resource_uri": "/api/v1/move/213/"}, {"learn_type": "machine", "name": "Swagger", "resource_uri": "/api/v1/move/207/"}, {"learn_type": "machine", "name": "Endure", "resource_uri": "/api/v1/move/203/"}, {"learn_type": "machine", "name": "Mud-slap", "resource_uri": "/api/v1/move/189/"}, {"learn_type": "machine", "name": "Sludge-bomb", "resource_uri": "/api/v1/move/188/"}, {"learn_type": "egg move", "name": "Faint-attack", "resource_uri": "/api/v1/move/185/"}, {"learn_type": "machine", "name": "Protect", "resource_uri": "/api/v1/move/182/"}, {"learn_type": "machine", "name": "Curse", "resource_uri": "/api/v1/move/174/"}, {"learn_type": "machine", "name": "Snore", "resource_uri": "/api/v1/move/173/"}, {"learn_type": "machine", "name": "Thief", "resource_uri": "/api/v1/move/168/"}, {"learn_type": "egg move", "name": "Screech", "resource_uri": "/api/v1/move/103/"}, {"learn_type": "machine", "name": "Cut", "resource_uri": "/api/v1/move/15/"}, {"learn_type": "machine", "name": "Substitute", "resource_uri": "/api/v1/move/164/"}, {"learn_type": "level up", "level": 31, "name": "Slash", "resource_uri": "/api/v1/move/163/"}, {"learn_type": "machine", "name": "Rock-slide", "resource_uri": "/api/v1/move/157/"}, {"learn_type": "machine", "name": "Rest", "resource_uri": "/api/v1/move/156/"}, {"learn_type": "machine", "name": "Bide", "resource_uri": "/api/v1/move/117/"}, {"learn_type": "machine", "name": "Double-team", "resource_uri": "/api/v1/move/104/"}, {"learn_type": "machine", "name": "Mimic", "resource_uri": "/api/v1/move/102/"}, {"learn_type": "machine", "name": "Rage", "resource_uri": "/api/v1/move/99/"}, {"learn_type": "machine", "name": "Toxic", "resource_uri": "/api/v1/move/92/"}, {"learn_type": "level up", "level": 19, "name": "Dig", "resource_uri": "/api/v1/move/91/"}, {"learn_type": "machine", "name": "Fissure", "resource_uri": "/api/v1/move/90/"}, {"learn_type": "level up", "level": 40, "name": "Earthquake", "resource_uri": "/api/v1/move/89/"}, {"learn_type": "level up", "level": 15, "name": "Growl", "resource_uri": "/api/v1/move/45/"}, {"learn_type": "machine", "name": "Double-edge", "resource_uri": "/api/v1/move/38/"}, {"learn_type": "machine", "name": "Take-down", "resource_uri": "/api/v1/move/36/"}, {"learn_type": "machine", "name": "Body-slam", "resource_uri": "/api/v1/move/34/"}, {"learn_type": "level up", "level": 24, "name": "Sand-attack", "resource_uri": "/api/v1/move/28/"}, {"learn_type": "level up", "level": 1, "name": "Scratch", "resource_uri": "/api/v1/move/10/"}], "name": "Diglett", "national_id": 50, "pkdx_id": 50, "resource_uri": "/api/v1/pokemon/50/", "sp_atk": 35, "sp_def": 45, "species": "", "speed": 95, "sprites": [{"name": "diglett", "resource_uri": "/api/v1/sprite/51/"}], "total": 0, "types": [{"name": "ground", "resource_uri": "/api/v1/type/5/"}], "weight": "8"}
```

repo_language: JavaScript

mime_type: text/plain


text:
# Node.js - Aula 03 - Exercício
**user:** [airton](https://github.com/airton)

**autor:** Airton Vancin Junior

**date:** 1455891128461

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?

A segunda requisiçao é vazia por causa do /favicon.ico

## Qual a DIFERENÇA entre o GET e o POST?

O GET faz uma requisição e retorna alguma coisa, o POST faz a requisiçao e grava os dados que são passados.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

**POST**

```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Airton Vancin Junior'
      , type: 'Aluno'
      });
console.log("postData", postData);
console.log("Tamanho do postData", postData.length);
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'POST'
      , path: '/api/pokemons'
      , headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        , 'Content-Length': postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.write(postData);
req.end();

junior@linux:~/www/be-mean-instagram-nodejs/files/aula03$ node http-request-post.js
postData name=Airton%20Vancin%20Junior&type=Aluno
Tamanho do postData 40
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"87","etag":"W/\"57-oqGkGdJmijrlvVY+9QhemQ\"","date":"Sat, 13 Feb 2016 22:49:34 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Airton Vancin Junior","type":"Aluno","_id":"56bfb2fdc08f331100525451"}

```

**PUT**

```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'airton'
      });
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'PUT'
      , path: '/api/pokemons/56bfb2fdc08f331100525451'
      , headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        , 'Content-Length': postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.write(postData);
req.end();

junior@linux:~/www/be-mean-instagram-nodejs/files/aula03$ node http-request-put.js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-ug7ULKX01O4OuFsRfIq22w\"","date":"Sat, 13 Feb 2016 22:53:30 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6250912625417256962","electionId":"565e25d106dca622271891c4"}}

```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'DELETE'
      , path: '/api/pokemons/56bfb2fdc08f331100525451'
      , headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.end();
```

```js
junior@linux:~/www/be-mean-instagram-nodejs/files/aula03$ node http-request-delete.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sat, 13 Feb 2016 22:58:47 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

```js
'use strict';

const http = require('http');
const json2html = require('node-json2html');

const options = {
    host: 'fipeapi.appspot.com'
    , path: '/api/1/carros/veiculos/20.json'
};

function callback(res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let data = '';

    res.setEncoding('utf8');
    res.on('data', (chunk) =>  {
        data += chunk;
    });
    res.on('end', () => {

        var transform = {'tag':'li','html':'${fipe_marca}: ${fipe_name} - ${marca} - ${key} - ${id} - ${name}'};

        var html = '<ul>';
            html += json2html.transform(data,transform);
            html += '</ul>';

        console.log('JSON: ', data)
        console.log('HTML: ', html)
    })
}

const req = http.request(options, callback);
req.on('error', (e) =>  {
    console.log('ERROOOO: ' + e.message);
});
req.end();
```

**JSON**
```json
[{"fipe_marca": "Ferrari", "fipe_name": "348 GTS 3.4", "marca": "FERRARI", "key": "348-417", "id": "417", "name": "348 GTS 3.4"}, {"fipe_marca": "Ferrari", "fipe_name": "348 Spider 3.4", "marca": "FERRARI", "key": "348-418", "id": "418", "name": "348 Spider 3.4"}, {"fipe_marca": "Ferrari", "fipe_name": "348 TS/TB 3.4", "marca": "FERRARI", "key": "348-419", "id": "419", "name": "348 TS/TB 3.4"}, {"fipe_marca": "Ferrari", "fipe_name": "355 Berlinetta", "marca": "FERRARI", "key": "355-420", "id": "420", "name": "355 Berlinetta"}, {"fipe_marca": "Ferrari", "fipe_name": "355 Berlinetta F1", "marca": "FERRARI", "key": "355-421", "id": "421", "name": "355 Berlinetta F1"}, {"fipe_marca": "Ferrari", "fipe_name": "355 GTS", "marca": "FERRARI", "key": "355-422", "id": "422", "name": "355 GTS"}, {"fipe_marca": "Ferrari", "fipe_name": "355 GTS F1", "marca": "FERRARI", "key": "355-423", "id": "423", "name": "355 GTS F1"}, {"fipe_marca": "Ferrari", "fipe_name": "355 GTS Spider", "marca": "FERRARI", "key": "355-424", "id": "424", "name": "355 GTS Spider"}, {"fipe_marca": "Ferrari", "fipe_name": "355 GTS Targa", "marca": "FERRARI", "key": "355-425", "id": "425", "name": "355 GTS Targa"}, {"fipe_marca": "Ferrari", "fipe_name": "355 Spider F1", "marca": "FERRARI", "key": "355-426", "id": "426", "name": "355 Spider F1"}, {"fipe_marca": "Ferrari", "fipe_name": "360 Challenge Stradale", "marca": "FERRARI", "key": "360-427", "id": "427", "name": "360 Challenge Stradale"}, {"fipe_marca": "Ferrari", "fipe_name": "360 Modena", "marca": "FERRARI", "key": "360-428", "id": "428", "name": "360 Modena"}, {"fipe_marca": "Ferrari", "fipe_name": "360 Modena F1", "marca": "FERRARI", "key": "360-429", "id": "429", "name": "360 Modena F1"}, {"fipe_marca": "Ferrari", "fipe_name": "360 Spider 400cv", "marca": "FERRARI", "key": "360-430", "id": "430", "name": "360 Spider 400cv"}, {"fipe_marca": "Ferrari", "fipe_name": "360 Spider F1 400cv", "marca": "FERRARI", "key": "360-431", "id": "431", "name": "360 Spider F1 400cv"}, {"fipe_marca": "Ferrari", "fipe_name": "456 GT", "marca": "FERRARI", "key": "456-432", "id": "432", "name": "456 GT"}, {"fipe_marca": "Ferrari", "fipe_name": "456 GTA", "marca": "FERRARI", "key": "456-433", "id": "433", "name": "456 GTA"}, {"fipe_marca": "Ferrari", "fipe_name": "456 M-GT 5.5 V12", "marca": "FERRARI", "key": "456-434", "id": "434", "name": "456 M-GT 5.5 V12"}, {"fipe_marca": "Ferrari", "fipe_name": "550 Maranello", "marca": "FERRARI", "key": "550-435", "id": "435", "name": "550 Maranello"}, {"fipe_marca": "Ferrari", "fipe_name": "575M Maranello F1 V12 515cv", "marca": "FERRARI", "key": "575m-436", "id": "436", "name": "575M Maranello F1 V12 515cv"}, {"fipe_marca": "Ferrari", "fipe_name": "612 Scaglietti F1 V12 540cv", "marca": "FERRARI", "key": "612-3932", "id": "3932", "name": "612 Scaglietti F1 V12 540cv"}, {"fipe_marca": "Ferrari", "fipe_name": "California 3.9 Turbo F1 V8 560cv", "marca": "FERRARI", "key": "california-7179", "id": "7179", "name": "California 3.9 Turbo F1 V8 560cv"}, {"fipe_marca": "Ferrari", "fipe_name": "California F1 V8 460cv", "marca": "FERRARI", "key": "california-5058", "id": "5058", "name": "California F1 V8 460cv"}, {"fipe_marca": "Ferrari", "fipe_name": "F12 Berlinetta 740cv", "marca": "FERRARI", "key": "f12-6463", "id": "6463", "name": "F12 Berlinetta 740cv"}, {"fipe_marca": "Ferrari", "fipe_name": "F430 F1", "marca": "FERRARI", "key": "f430-3812", "id": "3812", "name": "F430 F1"}, {"fipe_marca": "Ferrari", "fipe_name": "F430 SCUDERIA F1", "marca": "FERRARI", "key": "f430-4809", "id": "4809", "name": "F430 SCUDERIA F1"}, {"fipe_marca": "Ferrari", "fipe_name": "F430 Spider F1", "marca": "FERRARI", "key": "f430-4055", "id": "4055", "name": "F430 Spider F1"}, {"fipe_marca": "Ferrari", "fipe_name": "F458 Italia F1 4.5 V8 570cv", "marca": "FERRARI", "key": "f458-6094", "id": "6094", "name": "F458 Italia F1 4.5 V8 570cv"}, {"fipe_marca": "Ferrari", "fipe_name": "F458 Speciale F1 4.5 V8", "marca": "FERRARI", "key": "f458-6912", "id": "6912", "name": "F458 Speciale F1 4.5 V8"}, {"fipe_marca": "Ferrari", "fipe_name": "F458 Spider F1 4.5 V8 570cv", "marca": "FERRARI", "key": "f458-6156", "id": "6156", "name": "F458 Spider F1 4.5 V8 570cv"}, {"fipe_marca": "Ferrari", "fipe_name": "F599 GTB Fiorano F1 6.0 V12 620cv", "marca": "FERRARI", "key": "f599-4289", "id": "4289", "name": "F599 GTB Fiorano F1 6.0 V12 620cv"}, {"fipe_marca": "Ferrari", "fipe_name": "FF F1 6.3 V12 660cv", "marca": "FERRARI", "key": "ff-6095", "id": "6095", "name": "FF F1 6.3 V12 660cv"}]

```

```html
<ul>
   <li>Ferrari: 348 GTS 3.4 - FERRARI - 348-417 - 417 - 348 GTS 3.4</li>
   <li>Ferrari: 348 Spider 3.4 - FERRARI - 348-418 - 418 - 348 Spider 3.4</li>
   <li>Ferrari: 348 TS/TB 3.4 - FERRARI - 348-419 - 419 - 348 TS/TB 3.4</li>
   <li>Ferrari: 355 Berlinetta - FERRARI - 355-420 - 420 - 355 Berlinetta</li>
   <li>Ferrari: 355 Berlinetta F1 - FERRARI - 355-421 - 421 - 355 Berlinetta F1</li>
   <li>Ferrari: 355 GTS - FERRARI - 355-422 - 422 - 355 GTS</li>
   <li>Ferrari: 355 GTS F1 - FERRARI - 355-423 - 423 - 355 GTS F1</li>
   <li>Ferrari: 355 GTS Spider - FERRARI - 355-424 - 424 - 355 GTS Spider</li>
   <li>Ferrari: 355 GTS Targa - FERRARI - 355-425 - 425 - 355 GTS Targa</li>
   <li>Ferrari: 355 Spider F1 - FERRARI - 355-426 - 426 - 355 Spider F1</li>
   <li>Ferrari: 360 Challenge Stradale - FERRARI - 360-427 - 427 - 360 Challenge Stradale</li>
   <li>Ferrari: 360 Modena - FERRARI - 360-428 - 428 - 360 Modena</li>
   <li>Ferrari: 360 Modena F1 - FERRARI - 360-429 - 429 - 360 Modena F1</li>
   <li>Ferrari: 360 Spider 400cv - FERRARI - 360-430 - 430 - 360 Spider 400cv</li>
   <li>Ferrari: 360 Spider F1 400cv - FERRARI - 360-431 - 431 - 360 Spider F1 400cv</li>
   <li>Ferrari: 456 GT - FERRARI - 456-432 - 432 - 456 GT</li>
   <li>Ferrari: 456 GTA - FERRARI - 456-433 - 433 - 456 GTA</li>
   <li>Ferrari: 456 M-GT 5.5 V12 - FERRARI - 456-434 - 434 - 456 M-GT 5.5 V12</li>
   <li>Ferrari: 550 Maranello - FERRARI - 550-435 - 435 - 550 Maranello</li>
   <li>Ferrari: 575M Maranello F1 V12 515cv - FERRARI - 575m-436 - 436 - 575M Maranello F1 V12 515cv</li>
   <li>Ferrari: 612 Scaglietti F1 V12 540cv - FERRARI - 612-3932 - 3932 - 612 Scaglietti F1 V12 540cv</li>
   <li>Ferrari: California 3.9 Turbo F1 V8 560cv - FERRARI - california-7179 - 7179 - California 3.9 Turbo F1 V8 560cv</li>
   <li>Ferrari: California F1 V8 460cv - FERRARI - california-5058 - 5058 - California F1 V8 460cv</li>
   <li>Ferrari: F12 Berlinetta 740cv - FERRARI - f12-6463 - 6463 - F12 Berlinetta 740cv</li>
   <li>Ferrari: F430 F1 - FERRARI - f430-3812 - 3812 - F430 F1</li>
   <li>Ferrari: F430 SCUDERIA F1 - FERRARI - f430-4809 - 4809 - F430 SCUDERIA F1</li>
   <li>Ferrari: F430 Spider F1 - FERRARI - f430-4055 - 4055 - F430 Spider F1</li>
   <li>Ferrari: F458 Italia F1 4.5 V8 570cv - FERRARI - f458-6094 - 6094 - F458 Italia F1 4.5 V8 570cv</li>
   <li>Ferrari: F458 Speciale F1 4.5 V8 - FERRARI - f458-6912 - 6912 - F458 Speciale F1 4.5 V8</li>
   <li>Ferrari: F458 Spider F1 4.5 V8 570cv - FERRARI - f458-6156 - 6156 - F458 Spider F1 4.5 V8 570cv</li>
   <li>Ferrari: F599 GTB Fiorano F1 6.0 V12 620cv - FERRARI - f599-4289 - 4289 - F599 GTB Fiorano F1 6.0 V12 620cv</li>
   <li>Ferrari: FF F1 6.3 V12 660cv - FERRARI - ff-6095 - 6095 - FF F1 6.3 V12 660cv</li>
</ul>
```


text:
# Node.js - Aula 03 - Exercício
**User:** [Cerezini](https://github.com/Cerezini)
**Autor:** Mateus Cerezini Gomes

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?

Porque ele executa outro GET para buscar o ícone da tab (favicon.ico).

## Qual a DIFERENÇA entre o GET e o POST?

- **GET** é o método de leitura (read), deseja-se obter dados, os parâmetros passados na querystring são necessários para realizar a busca.
- **POST** é o método de inserção (create), deseja-se criar um objeto, os parâmetros passados são as informações necessárias para isso.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

```js
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"58","etag":"W/\"3a-sjfHHWizYlGIpgfVrIYyiw\"","date":"Wed, 09 Mar 2016 04:53:26 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Mateus","_id":"56dfac46526e7011009a58ec"}
```

```js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-FVMqgxkhExrRsjHpKb1Ypg\"","date":"Wed, 09 Mar 2016 04:56:36 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6259912239759753217","electionId":"565e25d106dca622271891c4"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

```js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Wed, 09 Mar 2016 04:59:20 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

```js
STATUS: 200
HEADERS: {"date":"Thu, 10 Mar 2016 05:21:08 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","set-cookie":["__cfduid=dc35e66a7feb7f6b554d6eb228f413c941457587268; expires=Fri, 10-Mar-17 05:21:08 GMT; path=/; domain=.widenet.com.br; HttpOnly"],"access-control-allow-origin":"*","pragma":"no-cache","cache-control":"no-store, no-cache, max-age=2592000","expires":"Sat, 09 Apr 2016 05:21:08 GMT","vary":"Accept-Encoding","server":"cloudflare-nginx","cf-ray":"2814524b2b9818b5-GRU"}
Dados finalizados:  <html><body><h1>Busca por CEP</h1><ul><li>status: 1</li><li>code: 06233-030</li><li>state: SP</li><li>city: Osasco</li><li>district: Piratininga</li><li>address: Rua Paula Rodrigues</li></ul></body></html>
```


text:
# Node.js - Aula 03 - Exercício

**user:** [gkal19](https://github.com/gkal19)

**autor:** Gabriel Kalani

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
Isso ocorre, pois o Chrome faz a primeira requisição para puxar os dados da `Querystring` e a segunda requisição é para puxar o `fav.icon` do site

## Qual a DIFERENÇA entre o GET e o POST?
Uma requisição **GET** é enviada como string anexada a URL, enquanto que a requisição **POST** é encapsulada junto ao corpo da requisição HTTP e não pode ser vista.
Já que GET é enviado via URL, então nós sabemos que ela só transporta textos. A requisição POST não tem restrições, pode transportar tanto texto, como dados binários.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
```js
//Criando Pokémon
postData name=Gabriel%20Kalani
Tamanho do postData 21
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*",
"content-type":"application/json; charset=utf-8","content-length":"66","etag":"W/\"42-xME2EVluNCG+T7UcvSd6kA\"",
"date":"Sat, 30 Jan 2016 22:22:56 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Gabriel Kalani","_id":"56ad37c0200ef511003a086b"}

//Modificando Pokémon
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*",
"content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-gWA7CuZscvFTWzd9tLFHDw\"",
"date":"Sat, 30 Jan 2016 22:26:05 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6245710367754813441","electionId":"565e25d106dca622271891c4"}}

```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```js
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express",
"access-control-allow-origin":"*",
"date":"Sat, 30 Jan 2016 22:28:35 GMT","via":"1.1 vegur"}
Dados finalizados:

```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.
```html
STATUS:  200
HEADERS:  {"content-type":"text/html","date":"Sat, 30 Jan 2016 22:28:35 GMT","connection":"close","transfer-encoding":"chunked"}
Dados finalizados:
<html><body><h1>Be MEAN - Instagram</h1></html></body>
```


text:
# Node.js - Aula 03 - Exercício
**Autor:** Ednilson Amaral
**Data:** 1450656297212

## Por que quando requisitamos ao nosso servidor de Query String, com o Chrome, ele executa 2 requisições, sendo a última "vazia"?

Isso ocorre porque o Chrome faz duas requisições, sendo uma delas para trazer os dados da requisição do usuário a segunda requisição para pegar o `favicon.ico`.

## Qual a DIFERENÇA entre o GET e o POST?

Uma das diferenças entre o método `GET` e `POST` é sua visibilidade. Enquanto a cada nova requisição `GET` é enviada como string junto a URL, a cada nova requisição `POST` é encapsulada junto ao corpo da requisição HTTP e não pode ser visualizada pelo usuário na URL.

Outras características que as tornam diferentes são:

* Tamanho: a string em um `GET` não pode conter mais que 255 caracteres; `POST` não há limitações;
* Performance: `GET` é mais rápida e mais simples; `POST` tem um perda de tempo, devido ao encapsulamento dos dados;
* Tipos: `GET` é apenas textos; `POST` não tem restrições, texto ou dados binários;
* Bookmarks: `GET` é possível salvar a URL nos seus favoritos, já que a requisição é armazenada em cache; `POST` não é possível;
* Método HTML Padrão: `GET` é o padrão de formulários; para utilizar o método `POST` em formulários é preciso especficiar no atributo `method` o valor `POST`;
* Dados: `GET` limitadas ao padrão ASCII; `POST` é possível utilizar o atributo *enctype* com o valor *multipart/form-data*, além do padrão UCS.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github, colocando aqui a resposta de cada passo.

### Criando

```
ednilson@EDNILSON-NB:/var/www/workshop-be-mean/nodejs$ node http-request-post-ednilson.js
postData name=Ednilson%20Amaral&type=dev%20frontend
Tamanho do postData 42
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"89","etag":"W/\"59-tHhf5TYro7igA37y6tizcQ\"","date":"Mon, 21 Dec 2015 00:27:04 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Ednilson Amaral","type":"dev frontend","_id":"56774758a173d8110083eb0e"}
```

### Modificando

```
ednilson@EDNILSON-NB:/var/www/workshop-be-mean/nodejs$ node http-request-put-ednilson.js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-Vc6BWVMoCTknBc0PvTN65Q\"","date":"Mon, 21 Dec 2015 00:30:15 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6230527873111818241","electionId":"565e25d106dca622271891c4"}}
```

## Depois faça o DELETE, criando o script para tal, colocando aqui a resposta.

```
ednilson@EDNILSON-NB:/var/www/workshop-be-mean/nodejs$ node http-request-delete-ednilson.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Mon, 21 Dec 2015 00:31:53 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma API externa e crie um script para fazer um GET nela mostrando o resultado com HTML.

A API externa escolhida foi a **pokeapi.co**, já utiliza em aula anteriormente.

O arquivo `http-get-api-externa.js` contém:

```js
'use strict';

const http = require('http');
const json2html = require('node-json2html');

http.get({
  hostname: 'pokeapi.co',
  path: '/api/v1/pokemon/1/',
  agent: false
},function(response){
    let body = '';

    console.log('STATUS: '+response.statusCode);
    console.log('HEADERS: '+JSON.stringify(response.headers));

    response.on('data', function(data){

    body += data;
  });

  response.on('end', function(){
    var transform = {'tag':'div','html':'${name}'};

    var html = json2html.transform(body,transform);
    console.log('RESPOSTA: ', html);
  });
});
```

Após o script para fazer uma `GET` nela o resultado foi:

```
ednilson@EDNILSON-NB:/var/www/workshop-be-mean/nodejs$ node http-get-api-externa.js
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Mon, 21 Dec 2015 02:18:34 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Accept","x-frame-options":"SAMEORIGIN","cache-control":"s-maxage=360, max-age=360"}
RESPOSTA:  <div>Bulbasaur</div>
```


text:
```md
# Node.js - Aula 03 - Exercício
**user:** [josecarlosweb](https://github.com/josecarloweb)
**autor:** JOSE CARLOS DA SILVA DE CARVALHO

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
A segunda requisição realizada pelo chrome é uma requisição GET pelo _favincon.ico_

## Qual a DIFERENÇA entre o GET e o POST?
Uma requisição GET possui por padrão argumentos expostos na URL (Ex. www.site.com.br/?var=valor). Há um tamanho limitado para a requisição GET (255 caracteres). Ele também é o tipo de requisição padrão do HTML.

Uma requisição POST possui seus argumentos encapsulados na mensagem HTTP. A requisição POST não pode transportar somente texto, podendo ser enviados arquivos/binários.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
**Criando o Pokemon**
node http-request-post.js
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"84","etag":"W/\"54-sJ+lyj1X1KVDI81lGmOzhw\"","date":"Sat, 19 Dec 2015 18:53:13 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Carlos Carvalho","type":"student","_id":"5675a799addf2e11003746ec"}

**Editando**
node http-request-put.js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-89O7HQ1nsBoqvhBp6xk+Mg\"","date":"Sat, 19 Dec 2015 18:54:03 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6230070149857148929","electionId":"565e25d106dca622271891c4"}}

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

**Código**
//file http-request-delete

'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
    name: 'Megaloaníaco de plantão',
});

const options = {
    host: 'webschool-io.herokuapp.com',
    method: 'DELETE',
    path: '/api/pokemons/5672e0e007bbbe11004259ee',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
    }
};

[callbacks, req e afins igual aos demais]

**Uso**
node http-request-delete.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sat, 19 Dec 2015 18:56:25 GMT","via":"1.1 vegur"}

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

API externa: fipeapi.appspot.com
Pacote extra: node-json2tml

**Código**
//file http-get-localhost-querystring

'use strict';

const http = require('http');
const json2html = require('node-json2html');
var retorno = '';

http.get({
    hostname: 'fipeapi.appspot.com',
    path: '/api/1/carros/marcas.json',
    port: 80,
    agent: false
},function(response){
    let body = '';
    console.log('STATUS: '+response.statusCode);
    console.log('HEADERS: '+JSON.stringify(response.headers));
    response.on('data', function(data){
        body += data;
    });

    response.on('end', function(){
        var transform = {'tag':'div','html':'${name} fipe_name ${fipe_name}'};

        var html = json2html.transform(body,transform);
        console.log('RESPOSTA: ', html);
    });
});

**Saída**
node http-get-fipe.js
STATUS: 200
HEADERS: {"cache-control":"no-cache","content-type":"application/json; charset=utf-8","date":"Sat, 19 Dec 2015 19:52:18 GMT","server":"Google Frontend","content-length":"7524","connection":"close"}
RESPOSTA:  <div>AUDI fipe_name Audi</div><div>BMW fipe_name BMW</div><div>CITROEN fipe_name Citroën</div><div>FIAT fipe_name Fiat</div><div>FORD fipe_name Ford</div><div>CHEVROLET fipe_name GM - Chevrolet</div><div>HONDA fipe_name Honda</div><div>HYUNDAI fipe_name Hyundai</div><div>KIA fipe_name Kia Motors</div><div>MERCEDES-BENZ fipe_name Mercedes-Benz</div><div>MITSUBISHI fipe_name Mitsubishi</div><div>NISSAN fipe_name Nissan</div><div>PEUGEOT fipe_name Peugeot</div><div>RENAULT fipe_name Renault</div><div>SUZUKI fipe_name Suzuki</div><div>TOYOTA fipe_name Toyota</div><div>VOLVO fipe_name Volvo</div><div>VOLKSWAGEN fipe_name VW - VolksWagen</div><div>ACURA fipe_name Acura</div><div>AGRALE fipe_name Agrale</div><div>ALFA ROMEO fipe_name Alfa Romeo</div><div>AM GEN fipe_name AM Gen</div><div>ASIA MOTORS fipe_name Asia Motors</div><div>ASTON MARTIN fipe_name ASTON MARTIN</div><div>BRM fipe_name BRM</div><div>BUGGY fipe_name Buggy</div><div>BUGRE fipe_name Bugre</div><div>CADILLAC fipe_name Cadillac</div><div>CBT JIPE fipe_name CBT Jipe</div><div>CHANA fipe_name CHANA</div><div>CHANGAN fipe_name CHANGAN</div><div>CHERY fipe_name CHERY</div><div>CHRYSLER fipe_name Chrysler</div><div>CROSS LANDER fipe_name Cross Lander</div><div>DAEWOO fipe_name Daewoo</div><div>DAIHATSU fipe_name Daihatsu</div><div>DODGE fipe_name Dodge</div><div>EFFA fipe_name EFFA</div><div>ENGESA fipe_name Engesa</div><div>ENVEMO fipe_name Envemo</div><div>FERRARI fipe_name Ferrari</div><div>FIBRAVAN fipe_name Fibravan</div><div>FOTON fipe_name FOTON</div><div>FYBER fipe_name Fyber</div><div>GEELY fipe_name GEELY</div><div>GREAT WALL fipe_name GREAT WALL</div><div>GURGEL fipe_name Gurgel</div><div>HAFEI fipe_name HAFEI</div><div>ISUZU fipe_name Isuzu</div><div>JAC fipe_name JAC</div><div>JAGUAR fipe_name Jaguar</div><div>JEEP fipe_name Jeep</div><div>JINBEI fipe_name JINBEI</div><div>JPX fipe_name JPX</div><div>LADA fipe_name Lada</div><div>LAMBORGHINI fipe_name LAMBORGHINI</div><div>LAND ROVER fipe_name Land Rover</div><div>LEXUS fipe_name Lexus</div><div>LIFAN fipe_name LIFAN</div><div>LOBINI fipe_name LOBINI</div><div>LOTUS fipe_name Lotus</div><div>MAHINDRA fipe_name Mahindra</div><div>MASERATI fipe_name Maserati</div><div>MATRA fipe_name Matra</div><div>MAZDA fipe_name Mazda</div><div>MERCURY fipe_name Mercury</div><div>MG fipe_name MG</div><div>MINI fipe_name MINI</div><div>MIURA fipe_name Miura</div><div>PLYMOUTH fipe_name Plymouth</div><div>PONTIAC fipe_name Pontiac</div><div>PORSCHE fipe_name Porsche</div><div>RAM fipe_name RAM</div><div>RELY fipe_name RELY</div><div>ROLLS-ROYCE fipe_name Rolls-Royce</div><div>ROVER fipe_name Rover</div><div>SAAB fipe_name Saab</div><div>SATURN fipe_name Saturn</div><div>SEAT fipe_name Seat</div><div>SHINERAY fipe_name SHINERAY</div><div>SMART fipe_name smart</div><div>SSANGYONG fipe_name SSANGYONG</div><div>SUBARU fipe_name Subaru</div><div>TAC fipe_name TAC</div><div>TROLLER fipe_name Troller</div><div>WAKE fipe_name Wake</div><div>WALK fipe_name Walk</div>

```


text:
# Node.js - Aula 03 - Exercício
**user:** [FranciscoValerio](https://github.com/FranciscoValerio)
**autor:** Francisco Henrique Ruiz Valério

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?

- usando o resultado da requisição e mostrando no console, podemos identificar que a segunda requisição é feita pelo webkit para o favicon.ico. Pois o mesmo não está sendo fornecido pela nossa aplicação.

## Qual a DIFERENÇA entre o GET e o POST?

**GET**
- Possui uma capacidade de 1024 caracteres, é utilizado quando se quer passar poucas informações para realizar uma pesquisa ou simplismente passar informações para outra página/api através da URL. O resultado desse método é armazenado no cache do client, ou seja, fica no histórico do navegador.

**POST**
- O método POST utiliza ao URI ao contrário de GET, para enviar as informações ao servidor. A URI não é retornável ao cliente, o que torna esse método mais seguro, pois não expõe as informações enviadas no navegador. Esse método não possui limite como o GET para envio, quando é feita uma requisição POST uma conexão paralela é aberta e os dados são enviados por ela. Essa requisição deverá ser formatada no corpo da mensagem como uma querystring, além de enviar no headers seu formato e tamanho.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

**INCLUSÃO**
node .\http-request-post.js
STATUS:201
HEADERS:{"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"85","etag":"W/\"55-OO2mIv68nmeRSifU8w4Vmw\"","date":"Mon, 21 Dec 2015 22:33:11 GMT","via":"1.1 vegur"}
Dados finalizados: {"__v":0,"name":"Francisco Henrique","type":"aluno","_id":"56787e27da0b041100ff4dc9"}

**ALTERAÇÃO**
node .\http-request-put.js
STATUS:202
HEADERS:{"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-4F/GbPdOma8/l74KTQEnxQ\"","date":"Mon, 21 Dec 2015 23:32:01 GMT","via":"1.1 vegur"}
Dados finalizados: {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6230883951670460417","electionId":"565e25d106dca622271891c4"}}

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

node .\http-request-delete.js
STATUS:204
HEADERS:{"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Mon, 21 Dec 2015 23:33:31 GMT","via":"1.1 vegur"}
Dados finalizados:

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

**CONSULTADO API (http://fipeapi.appspot.com/)**

node .\http-get-fipe.js
STATUS:200
HEADERS:{"cache-control":"no-cache","content-type":"application/json; charset=utf-8","date":"Tue, 22 Dec 2015 00:55:16 GMT","server":"Google Frontend","content-length":"1032","connection":"close"}
Dados finalizados: [{"fipe_marca": "Fiat", "fipe_codigo": "2014-1", "name": "2014 Gasolina", "marca": "FIAT", "key": "2014-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2014-1"}, {"fipe_marca": "Fiat", "fipe_codigo": "2013-1", "name": "2013 Gasolina", "marca": "FIAT", "key": "2013-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2013-1"}, {"fipe_marca": "Fiat", "fipe_codigo": "2012-1", "name": "2012 Gasolina", "marca": "FIAT", "key": "2012-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2012-1"}, {"fipe_marca": "Fiat", "fipe_codigo": "2011-1", "name": "2011 Gasolina", "marca": "FIAT", "key": "2011-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2011-1"}, {"fipe_marca": "Fiat", "fipe_codigo": "2010-1", "name": "2010 Gasolina", "marca": "FIAT", "key": "2010-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2010-1"}, {"fipe_marca": "Fiat", "fipe_codigo": "2009-1", "name": "2009 Gasolina", "marca": "FIAT", "key": "2009-1", "veiculo": "Palio 1.0 ECONOMY Fire Flex 8V 4p", "id": "2009-1"}]


text:
# Node.js - Aula 02 - Exercício
**user:** [falconeric](https://github.com/falconeric)
**autor:** Eric Lessa

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
Nesta requisição vazia o chrome faz um request do favicon.

## Qual a DIFERENÇA entre o GET e o POST?
**GET** Solicita dados a um recurso especificado.
**POST** Envia dados para serem processados em um recurso especificado.

### GET
Envia a query string através da URL.
>/test/demo_form.asp?name1=value1&name2=value2

* requisições via GET podem ser cacheadas
* permanecem no histórico do browser
* podem ser favoritadas
* nunca devem ser usadas para informar dados sensíveis, Ex. password
* possui restrição no tamanho
* deve ser usado apenas para recuperar dados

### POST
A query string é enviada no corpo da mensagem HTTP.
>POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2

* Post requests nunca são cacheados
* não permanecem no histórico do browser
* não podem ser favoritados
* não possuem restrições em relação ao seu tamanho

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
```
elcarvalho:be-mean-modulo-nodejs ericlessa$ node http-request-post.js
STATUS 201
HEADERS {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"77","etag":"W/\"4d-P2rkHtNv9Zh6eZfjzWTxCQ\"","date":"Mon, 20 Jun 2016 21:36:09 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Eric Lessa","type":"Aluno","_id":"576861c9952453110092d990"}

elcarvalho:be-mean-modulo-nodejs ericlessa$ node http-request-put.js
STATUS 202
HEADERS {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-qEl5GKr3i3oBfZfSLk56lg\"","date":"Mon, 20 Jun 2016 21:44:46 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6298393815292051457","electionId":"576451dfece94f32689e021d"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```
'use strict';

const http = require('http');
const options = {
        host: 'webschool-io.herokuapp.com'
      , path: '/api/pokemons/576861c9952453110092d990'
      , method: 'DELETE'
      , headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    };

function callback(res) {
  console.log('STATUS', res.statusCode);
  console.log('HEADERS', JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf-8');
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data);
  });
}

const req = http.request(options, callback);

req.on('error', (e) => {
  console.log('ERROR: ', e.message);
});
req.end();

elcarvalho:be-mean-modulo-nodejs ericlessa$ node http-request-delete.js
STATUS 204
HEADERS {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Mon, 20 Jun 2016 21:49:
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

```
'use strict';
const http = require('http');
const options = {
  host: 'api.usa.gov'
, path: '/jobs/search.json?query=developer'
};
let html = '';

function callback(res) {
  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    data = JSON.parse(data);
    html = '<html><body>';

    data.forEach((e) => {
        html += '<ul>';
        html += '<li>Vaga: '+ e.position_title +'</li>';
        html += '<li>Empresa: '+ e.organization_name +'</li>';
        html += '<li>Faixa Salarial: '+ e.minimum +'~'+ e.maximum +'</li>';
        html += '<li>Detalhes: '+ e.url +'</li>';
        html += '</ul>';
    });

    html += '</body></html>';
  });
}

const req = http.request(options, callback);
req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.end();

http.createServer(function(request, response){
	response.writeHead(200, {'Content-type': 'text/html'});
	response.write(html);
	response.end();
}).listen(3000, function(){
	console.log('Servidor rodando em localhost:3000');
});
```


text:
# Node.js - Aula 03 - Exercício

autor: Bruno Lima da Silva

## 1. Por que quando requisitamos ao nosso servidor de Query String, com o Chrome, ele executa 2 requisições, sendo a última "vazia"?
A segunda requisição é feita pelo webkit solicitando favicon.ico e retorna vazia pois a aplicação não possui favicon

## 2. Qual a DIFERENÇA entre o GET e o POST?
GET solicita um determiado recurso servindo como método serguro e não deve ser usado para disperar uma ação.
POST utiliza as informações enviadas no corpo da requisição para criar um novo revurso e também pode ser utilizado para processamentos que não são diretamente relacionados a um recurso.

## 3. Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github, colocando aqui a resposta de cada passo.
```js
'use strict';

const http = require('http');
const queryString = require('querystring');
const postData = queryString.stringify({
	name: 'Bruno Lima da Silva',
	type: 'Developer'
});

console.log('postData', postData);
console.log('Tamanho do postData', postData.length);

const options = {
	host: 'webschool-io.herokuapp.com',
	method: 'POST',
	path: '/api/pokemons',
	headers: {
		'Content-Type': 'application/x-www-form-urlencoded',
		'Content-Length': postData.length
	}
};

function callback(response) {
	console.log('STATUS: ' + response.statusCode);
	console.log('HEADERS: ' + JSON.stringify(response.headers));

	let data = '';

	response.setEncoding('utf8');
	response.on('data', (chunk) => {
		data += chunk;
	});

	response.on('end', () => {
		console.log('Dados finalizados', data);
	});
}

const request = http.request(options, callback)

request.on('error', (error) => {
	console.log('Erro' + error.message);
});

request.write(postData);
request.end();
```

```js
postData name=Bruno%20Lima%20da%20Silva&type=Developer
Tamanho do postData 45
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"90","etag":"W/\"5a-J4m44+PW7rFjlXfYKZgYXA\"","date":"Thu, 10 Nov 2016 04:59:59 GMT","via":"1.1 vegur"}
Dados finalizados {"__v":0,"name":"Bruno Lima da Silva","type":"Developer","_id":"5823fecec55c8f00121aea4f"}
```
```js
'use strict';

const http = require('http');
const queryString = require('querystring');
const postData = queryString.stringify({
	name: 'blsdotrocks',
});

console.log('postData', postData);
console.log('Tamanho do postData', postData.length);

const options = {
	host: 'webschool-io.herokuapp.com',
	method: 'PUT',
	path: '/api/pokemons/5823f259c55c8f00121aea4a',
	headers: {
		'Content-Type': 'application/x-www-form-urlencoded',
		'Content-Length': postData.length
	}
};

function callback(response) {
	console.log('STATUS: ' + response.statusCode);
	console.log('HEADERS: ' + JSON.stringify(response.headers));

	let data = '';

	response.setEncoding('utf8');
	response.on('data', (chunk) => {
		data += chunk;
	});

	response.on('end', () => {
		console.log('Dados finalizados', data);
	});
}

const request = http.request(options, callback)

request.on('error', (error) => {
	console.log('Erro' + error.message);
});

request.write(postData);
request.end();
```

```js
postData name=blsdotrocks
Tamanho do postData 16
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"121","etag":"W/\"79-OQ1I/gqDw8NPAMka9b82vw\"","date":"Thu, 10 Nov 2016 05:00:11 GMT","via":"1.1 vegur"}
Dados finalizados {"data":{"ok":1,"nModified":1,"n":1,"opTime":{"ts":"6351200116073824257","t":0},"electionId":"7fffffff0000000000000000"}}
```
## 4. Depois faça o DELETE, criando o script para tal, colocando aqui a resposta.
```js
'use strict';

const http = require('http');

const options = {
	host: 'webschool-io.herokuapp.com',
	method: 'DELETE',
	path: '/api/pokemons/5823fecec55c8f00121aea4f',
	headers: {
		'Content-Type': 'application/x-www-form-urlencoded'
	}
};

function callback(response) {
	console.log('STATUS: ' + response.status);
	console.log('HEADERS: ' + JSON.stringify(response.headers));

	let data = '';

	response.setEncoding('utf8');
	response.on('data', (chunk) => {
		data += chunk;
	});

	response.on('end', () => {
		console.log('Dados finalizados' + data);
	});
}

const request = http.request(options, callback);

request.on('error', (error) => {
	console.log('Error' + error.message);
});

request.end();
```

```js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Thu, 10 Nov 2016 05:01:32 GMT","via":"1.1 vegur"}
Dados finalizados
```

## 5. Escolha uma API externa e crie um script para fazer um GET nela mostrando o resultado com HTML.
```js
'use strict';

const http = require('http');

http.get({
	hostname: 'webschool-io.herokuapp.com',
	path: '/',
	port: 80,
	agent: false
}, (response) => {
	let body = '';
	console.log('STATUS: ' + response.status);
	console.log('HEADERS: ' + JSON.stringify(response.headers));

	response.on('data', (data) => {
		body += data;
	});

	response.on('end', () => {
		console.log('Resposta: ', body);
	});
});

```
```js
STATUS: 200
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","content-type":"text/html; charset=utf-8","content-length":"374","etag":"W/\"176-Pxdvu7DoyL19Fh8vgF9duw\"","date":"Thu, 10 Nov 2016 05:13:40 GMT","via":"1.1 vegur"}
Resposta:  <!DOCTYPE html><html><head><title>Api WebSchool</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Api WebSchool</h1><p>Welcome to Api WebSchool</p><p>Routes of api api/pokemons</p><ul><li>get api/pokemons</li><li>post api/pokemons</li><li>getOne api/pokemons/:id</li><li>put api/pokemons/:id</li><li>delete api/pokemons/:id</li></ul></body></html>
```


text:
# NodeJS - Aula 03 - Exercício
autor: Fábio Calheiros (conta: fabiocalheiros)

# 1. Por que quando requisitamos ao nosso servidor de Query String, `com o Chrome`, ele executa 2 requisições, sendo a última "vazia"?

Isso acontece porque o Chrome envia um pedido de um favicon em cada solicitação.
Como não enviamos um favicon de volta, ele a responde como um objeto vazio {}.

# 2. Qual a `DIFERENÇA` entre o `GET` e o `POST`?

Para diferenciarmos os dois podemos definir nos seguintes tópicos.

- Visibilidade:
Uma requisição GET é enviada como string anexada a URL, enquanto que a requisição POST é encapsulada junto ao corpo da requisição HTTP e não pode ser vista.

- Tamanho:
O GET possui um limite de até 255 caracteres e é cacheavel pelos navegadores, é aconselhavel para utilizar fazendo consultas simples. O POST não possui limites de caracteres.

- Performance:
A requisição GET é relativamente mais rápida, já que ela é mais simples. Na requisição POST há uma perda de tempo no encapsulamento da mensagem.

- Tipos:
O GET é enviado via URL, então nós sabemos que ela só transporta textos. A requisição POST não tem restrições, pode transportar tanto texto, como dados binários.

- Favoritos/Bookmarks:
Por se tratar apenas de uma URL, a requisição GET pode ser armazenada em cache, ou em um sistema de bookmark(favoritos). A mesma coisa não é possível para requisições POST.

- Método HTML Padrão:
GET é o método HTML padrão. Para submeter um formulário HTML usando POST é preciso especificar no atributo “method” o valor “POST”.

- Dados:
As requisições GET são limitadas ao padrão ASCII, enquanto que requisições POST também podem usar o atributo “enctype” com o valor “multipart/form-data”, que faz uso do padrão UCS(Universal Multiple-Octet Coded Character Set).

# 3. Crie um Pokemon na nossa API com o seu nome, depois modifique seu nome pelo seu user do Github, colocando aqui a resposta de cada passo.

```
node http-request-post.js
postData name=F%C3%A1bio%20Calheiros&type=Aluno
Tamanho do Post Data 38
STATUS:201
HEADERS:{"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"83","etag":"W/\"53-41MdFbUfWH/AU0Zi8klaOQ\"","date":"Mon, 28 Dec 2015 18:48:17 GMT","via":"1.1 vegur"}
Dados finalizados: {"__v":0,"name":"Fábio Calheiros","type":"Aluno","_id":"568183f1683c8d1100366f7a"}
```

```
node http-request-put.js
postData name=fabiocalheiros
Tamanho do Post Data 19
STATUS:202
HEADERS:{"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-JrRFgRg3QEV9v10ruiKLcg\"","date":"Mon, 28 Dec 2015 18:50:35 GMT","via":"1.1 vegur"}
Dados finalizados: {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6233409023073320961","electionId":"565e25d106dca622271891c4"}}
```

# 4. Depois faça o DELETE, criando o script para tal, colocndo aqui a resposta.

```
node http-request-delete.js
postData name=Fabrones
Tamanho do Post Data 13
STATUS:204
HEADERS:{"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Mon, 28 Dec 2015 18:52:49 GMT","via":"1.1 vegur"}
Dados finalizados:
```

# 5. Escolha uma API externa e crie um script para fazer um GET nela mostrando o resultado em HTML.

```
'use strict';

const https = require('https');
const json2html = require('node-json2html');

const options = {
	host: 'api.mercadolibre.com',
	path: '/users/156622161/'
};

function callback(res){
	console.log('STATUS:' + res.statusCode);
	console.log('HEADERS:' + JSON.stringify(res.headers));
	res.setEncoding('utf8');
	let data = '';
	res.on('data', (chunk) => {
		data += chunk;
	});

	res.on('end', ()=>{
		var transform = {'tag':'div','html':'${nickname} - id: ${id}'};
	    var html = json2html.transform(data,transform);
	    console.log(html);
	})
}

const req = https.get(options, callback);
	req.on('error', (e)=> {
		console.log('Erro ao fazer a leitura dos dados: '+e.message+'\n');
	});
req.end();

node exercicio03.js
STATUS:200
HEADERS:{"date":"Wed, 30 Dec 2015 19:43:21 GMT","content-type":"application/json;charset=UTF-8","transfer-encoding":"chunked","connection":"close","cache-control":"max-age=60, stale-while-revalidate=30, stale-if-error=120","vary":"Accept,Accept-Encoding","etag":"5faaf5170e91571d521d2a74d47c6162","x-content-type-options":"nosniff","x-request-id":"408c0459-754e-4f30-a2ca-663ec9abb90f","access-control-allow-origin":"*","access-control-allow-headers":"Content-Type","access-control-allow-methods":"PUT, GET, POST, DELETE, OPTIONS","access-control-max-age":"86400","x-xss-protection":"1; mode=block","strict-transport-security":"max-age=15724800"}
<div>HYPERCOMPRAS-ME - id: 156622161</div>
```


text:
# Node.js - Aula 03 - Exercício
**user:** [rafaeljourdan](https://github.com/rafaeljourdan)
**autor:** Rafael Jourdan

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
O chrome sempre envia 2 requisições, a primeira da URL requisitada e a segunda do favicon.ico. No Firefox somente na primeira vez.

## Qual a DIFERENÇA entre o GET e o POST?

* GET: O conteúdo (somente string) é enviado pela URL e tem limitações de tamanho (dependendo de cada agent). Este verbo do protocolo HTTP geralmente é utilizado para requisição de informações, enviando anexado chaves e valores que façam sentido nesta recuperação no bd.
* POST: O conteúdo é anexado ao corpo da requisição, com isso temos liberdade para enviar arquivos binários e uma quantidade maior de informações.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

#### Criação do pokemon Rafael F A Jourdan
```js
'use strict';

const http = require('http');
const querystring = require('querystring');

const postData = querystring.stringify({
    name: 'Rafael F A Jourdan ',
    type: 'aluno'
});

const options = {
    host: 'webschool-io.herokuapp.com',
    path: '/api/pokemons',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
    }
};

function callback(res) {

    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let data = '';

    res.setEncoding('utf8');

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log('Dados finalizados: ', data)
    })
}

const req = http.request(options, callback);

req.on('error', (e) => {
    console.log('ERRO: ' + e.message);
});

req.write(postData);
req.end();
```

##### Retorno

```js
$ node criacao-pokemon-exerc.js
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"appl
ication/json; charset=utf-8","content-length":"86","etag":"W/\"56-6S2zD85c/o0v9yG2k0jCmg\"","date":"Tue, 10 Jan 2017 18:16:02 GM
T","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Rafael F A Jourdan ","type":"aluno","_id":"587524e2c04fe500123ccee5"}
```

##### Atualização do nome

```js

'use strict';

const http = require('http');
const querystring = require('querystring');

const postData = querystring.stringify({
    name: 'rafaeljourdan',
    type: 'aluno'
});

const options = {
    host: 'webschool-io.herokuapp.com',
    path: '/api/pokemons/587524e2c04fe500123ccee5',
    method: 'PUT',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
    }
};

function callback(res) {

    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let data = '';

    res.setEncoding('utf8');

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log('Dados finalizados: ', data)
    })
}

const req = http.request(options, callback);

req.on('error', (e) => {
    console.log('ERRO: ' + e.message);
});

req.write(postData);
req.end();

```

//Modificando Pokémon
```html
$ node exerc_update-pokemon
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"appl
ication/json; charset=utf-8","content-length":"121","etag":"W/\"79-SymJl/JdkAwTz2Rl6bUJbw\"","date":"Tue, 10 Jan 2017 18:21:21 G
MT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"opTime":{"ts":"6374042770788581377","t":1},"electionId":"7fffffff000000
0000000001"}}

```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

```js

'use strict';

const http = require('http');
const querystring = require('querystring');

const postData = querystring.stringify({
    name: 'rafaeljourdan'
});

const options = {
    host: 'webschool-io.herokuapp.com',
    path: '/api/pokemons/5875246dc04fe500123ccee5',
    method: 'DELETE',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
    }
};

function callback(res) {

    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let data = '';

    res.setEncoding('utf8');

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log('Dados finalizados: ', data)
    })
}

const req = http.request(options, callback);

req.on('error', (e) => {
    console.log('ERRO: ' + e.message);
});

req.end();

```

##### Retorno (Não consegui deletar)
```html
$ node exerc_delete_pokemon
STATUS: 499
HEADERS: {"connection":"close","server":"Cowboy","date":"Tue, 10 Jan 2017 18:27:33 GMT","content-length":"506","content-type":"t
ext/html; charset=utf-8","cache-control":"no-cache, no-store"}
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.
```js
'use strict';

const http = require('http');

http.get({
    hostname: 'pokeapi.co',
    path: '/api/v2/pokemon/55/',
    port: 80,
    agent: false
}, (response) => {

    let body = '';

    console.log('STATUS: '+ response.statusCode);
    console.log('HEADERS: '+ response.headers);

    response.on('data', function(data){
       body += data;
    });

    response.on('end', function(){
       var nome = JSON.parse(body).forms[0].name;
       retornarHtml(nome);
    });

});

const retornarHtml = (nome) => {
    let html = '<html><head></head><body><h1>Nome do pokemon: '+nome+' </h1></body></html>';
    console.log(html);
};
```

```html
$ node exerc_get_api.js
STATUS: 200
HEADERS: [object Object]
<html><head></head><body><h1>Nome do pokemon: golduck </h1></body></html>
```


text:
# Node.js - Aula 03 - Exercício
**user:** [hc3](https://github.com/hc3)
**autor:** Eliel das Virgens
**date:** 20/03/2015

##01.Porque quando requisitamos ao nosso servidor de Query String com o chrome ele executa 2 requisições sendo a última vazia?
-no Chrome são feitas duas requisições a outra é pelo favicon.

##02.Qual a diferença entre o get e o post?
-O get requisita algo ao servidor por exemplo podemos fazer uma busca de uma imagem ao servidor
através do método get, o método post por sua vez consegue inserir algo no servidor alterar com uma segurança maior do que o get, por exemplo usando o get para buscar clientes no banco de dados e usamos o post para cadastrar um novo.

##03.Crie um pokemon na nossa API com seu nome depois modifique seu nome pelo seu User do GitHub colocando aqui a resposta de cada passo a passo.
```
hc3@darkSide:~/Bemean/Node$ node cria_pokemon.js
STATUS: 201
HEADERS: {"server":"darkSide","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"79","etag":"W/\"4f-FQst1JWQGV9Isx6b9QMehg\"","date":"Fri, 20 Mar 2016 22:10:40 GMT","via":"1.1 vegur"}
Dados finalizados {"__v":0,"name":"Eliel das Virgens","type":"SmokeMon","_id":"582f8gt12f61701100d72sc1"}
```

```
hc3@darkSide:~/Bemean/Node$ node altera_pokemon.js
STATUS: 201
HEADERS: {"server":"darkSide","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"79","etag":"W/\"4f-FQst1JWQGV9Isx6b9QMehg\"","date":"Fri, 20 Mar 2016 22:10:40 GMT","via":"1.1 vegur"}
Dados finalizados {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6240448465881530369","electionId":"582f8gt12f61701100d72sc1"}}
```

##04.Depois daça o delete criando o script para tal, colocando aqui a respota.
```
hc3@darkSide:~/Bemean/Node$ node exclui_pokemon.js
STATUS: 204
HEADERS: {"server":"darkSide","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Fri, 20 Mar 2016 22:10:40 GMT","via":"1.1 vegur"}
Dados finalizados
```

##05.Escolha uma API externa e crie um script para fazer um get nela mostrando o resultado com HTML
```
STATUS:  200
HEADERS:  {"content-type":"text/html","date":"Sun, 18 Jan 2016 19:25:00 GMT","connection":"close","transfer-encoding":"chunked"}
Dados finalizados:
<html><body><h1>Pokemons</h1><ul><li>Pokemon: Bulbassauro</li><li>Pokemon: Charmander</li><li>Pokemon: Squirtle</li><li>Pokemon: Pikachu</li></ul></body></html>
```


text:
# Node.js - Aula 03 - Exercício

**user:** [jeffersondanielss](https://github.com/jeffersondanielss)

**autor:** Jefferson Daniel Santos Silva

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
Por que a cada requisição o chrome pede também um favicon.

## Qual a DIFERENÇA entre o GET e o POST?
O método GET transporta apenas textos até 255 caracteres que podem ser armazenadas em cache, já o POST pode transportar outros tipos de dados, não possui tamanho máximo para envio mas não pode ser armazenado em cache.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
```
  STATUS: 201
  HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-c
  ontrol-allow-origin":"*","content-type":"application/json; charset=utf-8","content-
  length":"83","etag":"W/\"53-RXG9NFsfcTshTpw7BRBGLw\"","date":"Sun, 13 Mar 2016 19:1
  4:48 GMT","via":"1.1 vegur"}
  Dados finalizados:  {"__v":0,"name":"Jefferson Daniel","type":"Aluno","_id":"56e5bc
  2733a78b1100c06ebb"}
```

```
  STATUS: 202
  HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-c
  ontrol-allow-origin":"*","content-type":"application/json; charset=utf-8","content-
  length":"108","etag":"W/\"6c-zxp2AvRAjB/3nkyyVhKR6A\"","date":"Sun, 13 Mar 2016 19:
  37:31 GMT","via":"1.1 vegur"}
  Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"62616235909536808
  97","electionId":"565e25d106dca622271891c4"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```
  'use strict';

  const http = require('http');
  const querystring = require('querystring');

  const options = {
    host: 'webschool-io.herokuapp.com'
  , method: 'DELETE'
  , path: '/api/pokemons/56e5bc2733a78b1100c06ebb'
  };

  function callback(res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let data = '';

    res.setEncoding('utf8');
    res.on('data', (chunk) =>  {
      data += chunk;
    });
    res.on('end', () => {
      console.log('Dados finalizados: ', data)
    })
  }

  const req = http.request(options, callback);

  req.on('error', (e) =>  {
    console.log('ERROOOO: ' + e.message);
  });
  req.end();

  STATUS: 204
  HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by
  ":"Express","access-control-allow-origin":"*","date":"Sun, 13 Mar 2016 19:51:58 GMT
  ","via":"1.1 vegur"}
  Dados finalizados:
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

```
'use strict';

const http = require('http');
var result = '';

http.get({
     hostname: 'webschool-io.herokuapp.com'
    ,path: '/api/pokemons'
    ,port:80
    ,agent: false

}, ( response )=>{

    console.log('STATUS: '+response.statusCode);
    console.log('HEADERS: '+JSON.stringify(response.headers));
    response.on('data', function( data ){
        result += data;
    });
    response.on('end', function(){
        newServer();
    });

});

function newServer(){
    http.createServer(function(request, response){
        var pokemons = JSON.parse( result );
        for(var key in pokemons){
            var pokemon = pokemons[key];
            response.write('<b>ID:</b> '+pokemon._id+' <b>Nome:</b> '+pokemon.name+' <b>Tipo:</b> '+pokemon.type+'<br>');
        }
        response.end();
    }).listen(3000, function(){
        console.log('Porta: 3000');
    });
}
```


text:
# Node.js - Aula 03 - Exercício
**user:** [ajoao88](https://github.com/ajoao88)
**autor:** João Paulo S de Araújo
**date:** 1454957716069

## 1. Por que quando requisitamos ao nosso servidor de Q!uery String, **com o Chrome**, ele executa 2 requisições, sendp a última "vazia"?
Porque atumaticamente ele faz uma segunda requisição solicitando o "favicon.ico", esse favicon hoje é usado para melhor identificação da página, fica à esquena do title na aba do navegador.

## 2. Qual a DIFERENÇA entre o GET e o POST?

|Característica                 | GET                                                                              | POST|
|------------------------------ | -------------------------------------------------------------------------------- |-----|
|**Limite bytes**               | 1024 bytes.                                                                      | Não possui.|
|**Padrão de transmissão**      | URL (Uniform Resource Locator).                                                  | URI (Uniform Resource Indentifier).|
|**Como lida com os dados**     | Expôe os dados na barra de endereços e eles ficam em cache (histórico).          | Encapsula os dados no corpo da requisição HTTP (Hyper Text Transfer Protocol), nenhum dado é visivel ao cliente e nem fica em cache.|
|**Formato dos dados enviados** | Query String                                                                     | Query String|
|**Indicações**                 | Envio de poucas e pequenas informações que não necessitam de segurançaou sigilo. | Envio de bastante e/ou grandes informações ou que necessitem de segurança e sigilo.|

## 3. Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github, colocando aqui a resposta de cada passo.
### Criação:
> **postData:**  name=Jo%C3%A3o%20Paulo&type=Estudante
**Tamanho do postData:**  37
**STATUS:** 201
**HEADERS:**

> ```json
> {
>     "server":"Cowboy",
>     "connection":"close",
>     "x-powered-by":"Express",
>     "access-control-allow-origin":"*",
>     "content-type":"application/json;charset=utf-8",
>     "content-length":"82",
>     "etag":"W/"52-vko+eX5L8Ez2Vut24AhcMg"",
>     "date":"Mon, 08 Feb 2016 19:54:04 GMT",
>     "via":"1.1 vegur"
> }
> ```

> **Dados finalizados:**

> ```json
> {
>     "__v":0,
>     "name":"João Paulo",
>     "type":"Estudante",
>     "_id":"56b8f25cde84f01100aba215"
> }
> ```

### Atualização
> **postData:**  name=ajoao88
**Tamanho do postData:**  12
**STATUS:** 202
**HEADERS:**

> ```json
> {
>     "server":"Cowboy",
>     "connection":"close",
>     "x-powered-by":"Express",
>     "access-control-allow-origin":"*",
>     "content-type":"application/json; charset=utf-8",
>     "content-length":"108",
>     "etag":"W/"6c-XhSV7vAGvhRKZPCPduEgRQ"",
>     "date":"Mon, 08 Feb 2016 20:04:52 GMT","via":"1.1 vegur"
> }
> ```

> **Dados finalizados:**

> ```json
> {
>  "data":
>      {
>          "ok":1,
>          "nModified":1,
>          "n":1,
>          "lastOp":"6249013743066284033",
>          "electionId":
>          "565e25d106dca622271891c4"
>      }
> }
> ```

## 4. **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
> postData:''
Tamanho do postData:  0
STATUS: 204
HEADERS:

> ```json
> {
>     "server":"Cowboy",
>     "content-length":"0",
>     "connection":"close",
>     "x-powered-by":"Express",
>     "access-control-allow-origin":"*",
>     "date":"Mon, 08 Feb 2016 20:22:42 GMT",
>     "via":"1.1 vegur"
> }
> ```

> Dados finalizados: ''

## 5. Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

#### [Api Mercado Libre](https://api.mercadolibre.com)

```js
'use strict'

const https = require('https'),
    options = {
        host: 'api.mercadolibre.com',
        path: '/sites/'
    },
    json2Html = require('node-json2html')
function callback(res) {
    console.log('STATUS: ' + res.statusCode);
    console.log('HEADERS: ' + JSON.stringify(res.headers));

    let body = '';

    res.setEncoding('utf-8');
    res.on('data',(chunk) => {
        body += chunk;
    });

    res.on('end', () => {
        var transform = {
            "tag": "li","id": "${id}","html": "${name}"
        };
        var html = "<ul>"
        html += json2Html.transform(body,transform);
        html += "</ul>"
        console.log('Dados em JSON: ', body);
        console.log('Dados em HTML: ',html);
    });
}

const req = https.request(options,callback);
req.on('error', (e) => {
    console.log('Erro: ' + e.message);
});

req.end();
```
Dados em JSON:
```json
[
    {"id":"MLA","name":"Argentina"},
    {"id":"MBO","name":"Bolivia"},
    {"id":"MLB","name":"Brasil"},
    {"id":"MLC","name":"Chile"},
    {"id":"MCO","name":"Colombia"},
    {"id":"MCR","name":"Costa Rica"},
    {"id":"MRD","name":"Dominicana"},
    {"id":"MEC","name":"Ecuador"},
    {"id":"MGT","name":"Guatemala"},
    {"id":"MLM","name":"Mexico"},
    {"id":"MPY","name":"Paraguay"},
    {"id":"MPA","name":"Panamá"},
    {"id":"MPE","name":"Perú"},
    {"id":"MPT","name":"Portugal"},
    {"id":"MLU","name":"Uruguay"},
    {"id":"MLV","name":"Venezuela"}
]
```

Dados em HTML:
```html
<ul>
    <li id="MLA">Argentina</li>
    <li id="MBO">Bolivia</li>
    <li id="MLB">Brasil</li>
    <li id="MLC">Chile</li>
    <li id="MCO">Colombia</li>
    <li id="MCR">Costa Rica</li>
    <li id="MRD">Dominicana</li>
    <li id="MEC">Ecuador</li>
    <li id="MGT">Guatemala</li>
    <li id="MLM">Mexico</li>
    <li id="MPY">Paraguay</li>
    <li id="MPA">Pana má</li>
    <li id="MPE">Perú</li>
    <li id="MPT">Portugal</li>
    <li id="MLU">Uruguay</li>
    <li id="MLV">Venezuela</li>
</ul>
```


text:
# Node.js - Aula 03 - Exercício
**User:** [Geriel Castro](https://github.com/geriel)

**Autor:** Geriel Castro

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
Isso ocorre apenas no Chrome, na primeira requisição ele obtem os dados normalmente, na segunda requisição é solicitado o `favicon` do servidor

## Qual a DIFERENÇA entre o GET e o POST?
* **GET**
  - As informações são enviadas como String na URL
  - Tamanho limitado de capacidade de envio
  - Mais rápido já que é mais simples
  - Envia somente String
  - Informações enviadas ficam ficam armazenadas no cache

* **POST**
  - As informações são encapsuladas junto ao corpo da requisição HTTP
  - Sem limitação de comprimento
  - As informações não ficam gravadas em cache
  - Por conta do encapsulamento gera uma demora no envio
  - Envia qualquer tipo de dados

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
```js
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"80","etag":"W/\"50-hf+ZFF9yxZcHPPp5dfTIeg\"","date":"Mon, 28 Mar 2016 05:36:55 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Geriel","type":"Aluno","_id":"56f8c2f790983f110020cabe"}
```
---
```js
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-tMnyX/9VLwyzxeDMUlkj3A\"","date":"Mon, 28 Mar 2016 05:39:16 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6266973853189144577","electionId":"56ee12f2563048036a1e77e7"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Mon, 28 Mar 2016 05:41:35 GMT","via":"1.1 vegur"}
Dados finalizados:

```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.
```html
STATUS: 200
HEADERS: {"date":"Mon, 28 Mar 2016 06:18:44 GMT","content-type":"application/json","content-length":"319","connection":"close","set-cookie":["__cfduid=d4d2fb3ef3de7ad617f9b2ff7fd1feb321459145924; expires=Tue, 28-Mar-17 06:18:44 GMT; path=/; domain=.postmon.com.br; HttpOnly"],"access-control-allow-origin":"*","cache-control":"public, max-age=2592000","x-cache-status":"MISS","cf-cache-status":"HIT","expires":"Wed, 27 Apr 2016 06:18:44 GMT","server":"cloudflare-nginx","cf-ray":"28a8f76b9b8123ae-IAD"}
<html>
	<body>
    	<h1> RESULT: </h1>
        <pre>
          {
            "complemento": "de 146 ao fim - lado par",
            "bairro": "Centro",
            "cidade": "Rio de Janeiro",
            "logradouro": "Avenida Rio Branco",
            "estado_info": {
              "area_km2": "43.777,954",
              "codigo_ibge": "33",
              "nome": "Rio de Janeiro"
            },
            "cep": "20040003",
            "cidade_info": {
              "area_km2": "1200,278",
              "codigo_ibge": "3304557"
            },
            "estado": "RJ"
          }
        </pre>
	</body>
</html>
```


text:
# Node.js - Aula 03 - Exercício

**user:** [fernandobd42](https://github.com/fernandobd42/)
**autor:** Fernando Lucas

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
Porque além da requisição explícita, ela faz uma requisição implícita para buscar o favicon

## Qual a DIFERENÇA entre o GET e o POST?
* **GET:** É o método de leitura, que passa informações como parâmetros pela URL, aceita só String e tem tamanho limitado.

* **POST:** É o método de inserção, suas informações são incapsuladas no HTTP, aceitar qualquer tipo de dado, e não tem limite de tamanho.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

## CRIANDO - POST
```
const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Fernando'
      , type: 'Estudante/Desenvolvedor'
      });
console.log('Tamanho:', postData);
console.log('Tamanho do postData: ', postData.length);
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'POST'
      , path: '/api/pokemons'
      , headers: {
          'Content-Type' : 'application/x-www-form-urlencoded'
        , 'Content-Length' : postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('erro', (e) => {
  console.log('EROOOO: ' + e.message);
});
req.write(postData);
req.end();

```

#### SAíDA
```
Tamanho: name=Fernando&type=Estudante%2FDesenvolvedor
Tamanho do postData:  44
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"93","etag":"W/\"5d-LFekuOlLnoKhZ+3ogin1sg\"","date":"Sat, 12 Nov 2016 17:21:35 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Fernando","type":"Estudante/Desenvolvedor","_id":"58274f9f771fcc0012ecc28b"}
```

## MODIFICANDO - PUT
```
const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'fernandobd42'
      , type: 'Estudante/Desenvolvedor'
      });

const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'PUT'
      , path: '/api/pokemons/58274f9f771fcc0012ecc28b'
      , headers: {
          'Content-Type' : 'application/x-www-form-urlencoded'
        , 'Content-Length' : postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('erro', (e) => {
  console.log('EROOOO: ' + e.message);
});
req.write(postData);
req.end();

```

#### SAíDA
```
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"121","etag":"W/\"79-okD1ZBdyVqHfX5H6W/u62A\"","date":"Sat, 12 Nov 2016 17:24:31 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"opTime":{"ts":"6352134099662012417","t":0},"electionId":"7fffffff0000000000000000"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```
const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Fernando'
      , type: 'Estudante/Desenvolvedor'
      });

const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'DELETE'
      , path: '/api/pokemons/58274f9f771fcc0012ecc28b'
      , headers: {
          'Content-Type' : 'application/x-www-form-urlencoded'
        , 'Content-Length' : postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('erro', (e) => {
  console.log('EROOOO: ' + e.message);
});
req.write(postData);
req.end();

```

#### SAÍDA
```
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sat, 12 Nov 2016 17:25:40 GMT","via":"1.1 vegur"}
Dados finalizados:
```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.
```
const http = require('http');

const options = {
  host: 'api.redtube.com'
, path: '/?data=redtube.Videos.searchVideos&search=girlfriend'
};

function callback(res) {
  console.log('STATUS: '+ res.statusCode);
  console.log('HEADERS: '+ JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
  data += chunk;
  });
  res.on('end', () => {
    var result = JSON.parse(data);
    console.log('<html><head><title>Exercicio 3</title></head>');
    console.log('<body><div>');
    console.log(result.videos[0].video);
    console.log('</div></body></html>');
  })
}

const req = http.request(options, callback);
req.on('error', (e) => {
  console.log('ERROOOOO: ' + e.message)
});
req.end();

```

#### SAÍDA
```
STATUS: 200
HEADERS: {"server":"nginx","date":"Sat, 12 Nov 2016 18:29:19 GMT","content-type":"application/json;charset=utf-8","transfer-encoding":"chunked","connection":"close","set-cookie":["PHPSESSID=u9h2tiu22btr5ehp15hv4he3t2; path=/","RNLBSERVERID=ded6287; path=/"],"expires":"Thu, 19 Nov 1981 08:52:00 GMT","cache-control":"no-store, no-cache, must-revalidate, post-check=0, pre-check=0","pragma":"no-cache"}
<html><head><title>Exercicio 3</title></head>
<body><div>
{ duration: '6:04',
  views: '0',
  video_id: '1806447',
  rating: '3.00',
  ratings: '2',
  title: 'Lucy Levon takes some dick from a geek',
  url: 'http://www.redtube.com/1806447',
  embed_url: 'http://embed.redtube.com/?id=1806447',
  default_thumb: '//thumbs-cdn.redtube.com/m=e0YH8f/media/videos/0001806/1806447/thumbs/1806447_015o.jpg',
  thumb: '//thumbs-cdn.redtube.com/m=e0YH8f/media/videos/0001806/1806447/thumbs/1806447_015o.jpg',
  publish_date: '2016-11-12 18:34:31',
  tags:
   [ { tag_name: 'Amateur' },
     { tag_name: 'Asian' },
     { tag_name: 'Blowjob' },
     { tag_name: 'Couple' },
     { tag_name: 'HD' },
     { tag_name: 'MILF' },
     { tag_name: 'Oral Sex' },
     { tag_name: 'Vaginal Sex' } ] }
</div></body></html>

```


text:
# Node.js - Aula 03 - Exercício
**user:** [fauker](https://github.com/fauker)

**autor:** LUCAS DA SILVA MOREIRA

## Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
A requisição adicional é feita porque o **Chrome** está tentando buscar
o `favicon.ico` da aplicação.

## Qual a DIFERENÇA entre o GET e o POST?
De uma forma bem simples: `GET` é utilizado para requisitar dados sem
alterá-los no servidor, enquanto `POST` é utilizado para inserir algo no
servidor. Por exemplo: uma página de pesquisa deve utilizar `GET`,
enquanto um formulário de cadastro deve utilizar `POST` para submeter as
informações ao servidor.

Comparação:

**Histórico**:
- GET: Os parâmetros são salvos no browser porque eles fazem parte da
  URL.
- POST: Os parâmetros não são salvos no browser.

**Favoritos no navegador**:
- GET: Pode ser adicionado em favoritos, no navegador.
- POST: Não pode ser adicionado em favoritos, no navegador.

**Tipos de dados suportados**:
- GET: application/x-www-form-urlencoded
- POST: multipart/form-data ou application/x-www-form-urlencoded

**Cache**:
- GET: Pode ser cacheado
- POST: Não pode ser cacheado

**Restrições no formato dos dados**:
- GET: Apenas caracteres ASCII são permitidos
- POST: Sem restrições. Arquivos binátios também são permitidos.

**Usabilidade/Visibilidade**:
- GET: Todas as informações são visíveis na URL, portanto não é
  recomendado utilizar este método para enviar informações delicadas,
  senhas etc.
- POST: As informações são enviadas junto com a requisição HTTP,
  portando nada fica visível na URL. Sendo assim, este método é o
  recomendado para o envio de informações delicadas/senhas para o
  servidor.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.

**POST**

```
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Lucas Moreira'
      , type: 'student'
      });
console.log("postData", postData);
console.log("Tamanho do postData", postData.length);
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'POST'
      , path: '/api/pokemons'
      , headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        , 'Content-Length': postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.write(postData);
req.end();
```

**Resposta**:

```
postData name=Lucas%20Moreira&type=student
Tamanho do postData 33
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"82","etag":"W/\"52-aF+iYI+9imnEnoNvlnzrzQ\"","date":"Thu, 21 Apr 2016 13:05:28 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Lucas Moreira","type":"student","_id":"5718d018cdd40a1100cf59a1"}
```

**PUT**

```
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'fauker'
      });
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'PUT'
      , path: '/api/pokemons/5718d018cdd40a1100cf59a1'
      , headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        , 'Content-Length': postData.length
        }
      };

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = '';

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('Dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.write(postData);
req.end();
```

**Resposta:**

```
STATUS: 202
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-MWWv9jU4vqlcL2ixcMLOUQ\"","date":"Thu, 21 Apr 2016 13:12:31 GMT","via":"1.1 vegur"}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.

**DELETE**

```
'use strict';

const http = require('http');
const querystring = require('querystring');
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'delete'
      , path: '/api/pokemons/5718d018cdd40a1100cf59a1'
      , headers: {
          'content-type': 'application/x-www-form-urlencoded'
        }
      };

function callback(res) {
  console.log('status: ' + res.statuscode);
  console.log('headers: ' + json.stringify(res.headers));

  let data = '';

  res.setencoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    console.log('dados finalizados: ', data)
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('erroooo: ' + e.message);
});
req.end();
```

***Resposta***

```
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Thu, 21 Apr 2016 13:16:17 GMT","via":"1.1 vegur"}
```
## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.

```
'use strict';

const http = require('http');

const options = {
  host: 'api.redtube.com'
, path: '/?data=redtube.Videos.searchVideos&search=Sasha%20Gray'
};

function callback(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

  let data = [];

  res.setEncoding('utf8');
  res.on('data', (chunk) =>  {
    data += chunk;
  });
  res.on('end', () => {
    var json = JSON.parse(data);
    console.log('<html>');
    console.log('<head></head>');
    console.log('<body>');
    console.log('<div>');
    console.log(json.videos[0].video);
    console.log('</div>');
    console.log('</body>');
    console.log('</html>');
  })
}

const req = http.request(options, callback);

req.on('error', (e) =>  {
  console.log('ERROOOO: ' + e.message);
});
req.end();
```

```
STATUS: 200
HEADERS: {"server":"nginx","date":"Thu, 21 Apr 2016 13:41:52 GMT","content-type":"application/json;charset=utf-8","transfer-encoding":"chunked","connection":"close","set-cookie":["PHPSESSID=8ta1697inn11p57ponibo5g705; path=/","RNLBSERVERID=ded6281; path=/"],"expires":"Thu, 19 Nov 1981 08:52:00 GMT","cache-control":"no-store, no-cache, must-revalidate, post-check=0, pre-check=0","pragma":"no-cache"}
<html>
<head></head>
<body>
<div>
{ duration: '11:24',
  views: '574759',
  video_id: '302038',
  rating: '3.87',
  ratings: '450',
  title: 'Sasha Grey at Anatomie HD',
  url: 'http://www.redtube.com/302038',
  embed_url: 'http://embed.redtube.com/?id=302038',
  default_thumb: 'http://img.l3.cdn.redtubefiles.com/_thumbs/0000302/0302038/0302038_012m.jpg',
  thumb: 'http://img.l3.cdn.redtubefiles.com/_thumbs/0000302/0302038/0302038_012m.jpg',
  publish_date: '2016-04-20 10:50:01',
  tags:
   [ { tag_name: 'Anal Sex' },
     { tag_name: 'Brunette' },
     { tag_name: 'Caucasian' },
     { tag_name: 'Couple' },
     { tag_name: 'Hairy' },
     { tag_name: 'Pornstar' },
     { tag_name: 'Uniform' } ],
  stars: [ { star_name: 'Sasha Grey' } ] }
</div>
</body>
</html>
```