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

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

**Autor:** Gabriel Kalani

**Data:** 1468455084502

### Índice

##### [Parte 01](#parte-01)
##### [Parte 02](#parte-02)
##### [Parte 03](#parte-03)

### Parte 01

### 1- Usando o exemplo do req.params, recebe os parâmetros name, email, cpf, transforme-os em um schema do mongoose, salve-o no mongo e devolva o resultado, usando res.json(user). Use o postman ou o navegador (grave 5 users ou mais):

```js
// schema.js
'use strict';

const mongoose = require('mongoose');

const nome = {type: String, required: true};
const email = {type: String, required: true};
const cpf = {type: String, required: true};

const _schema = {
  nome,
  email,
  cpf
}

const UserSchema = new mongoose.Schema(_schema);

module.exports = UserSchema;
```

```js
// user-model.js
'use strict'

require("./db-config");
const UserSchema = require('./schema');
const UserModel = require('./model')("Usuarios",UserSchema);

const callback = (err, data, res) => {
  if (err) return res.status(400).send(err);
  res.json(data);
};

const CRUD = {
  create : (res, user) => {
    UserModel.create(user, (err, data) => callback(err, data, res));
  }
}

module.exports = CRUD;
```

```js
// ex01.js
'use strict'

const express = require('express');
const app = express();
const UserModel = require('./user-model');

app.get('/user/:nome/:email/:cpf', (req, res) => {
  const nome = req.params.nome;
  const email = req.params.email;
  const cpf = req.params.cpf;

  const user = {"Nome": nome, "Email":email, "CPF":cpf };
  UserModel.create(res, user);

});

app.listen(3000, () => {
  console.log("Servidor sendo executado na porta 3000");
});
```

> Com o Postman peguei as chamadas pelo GET

```
// Chamada 1
Chamada1: localhost:3000/user/gabriel/gabrielsilva1956@gmail.com/12345678
Retorno:
{
    "__v":0,
    "nome":"gabriel",
    "email":"gabrielsilva1956@gmail.com",
    "cpf":"12345678",
    "_id":"57869e24e6475ff30c5fd1ce"
}
// Chamada 2
Chamada2: localhost:3000/user/jean%20suissa/jnascimento@gmail.com/12345678
Retorno:
{
   "__v":0,
   "nome":"jean suissa",
   "email":"jnascimento@gmail.com",
   "cpf":"12345678",
   "_id":"57869f2de6475ff30c5fd1cf"
}
// Chamada 3
Chamada3: localhost:3000/user/darth%20vader/vader@empire.net/12345678
Retorno:
{
   "__v":0,
   "nome":"darth vader",
   "email":"vader@empire.net",
   "cpf":"12345678",
   "_id":"57869fb0e6475ff30c5fd1d1"
}
// Chamada 4
Chamada4: localhost:3000/user/chewbacca/chewie@falcon.com/12345678
Retorno:
{
   "__v":0,
   "nome":"chewbacca",
   "email":"chewie@falcon.com",
   "cpf":"12345678",
   "_id":"57869ff6e6475ff30c5fd1d2"
}
// Chamada 5
Chamada5: localhost:3000/user/han%20solo/han-solo@falcon.com/12345678
Retorno:
{
   "__v":0,
   "nome":"han solo",
   "email":"han-solo@falcon.com",
   "cpf":"12345678",
   "_id":"5786a04ce6475ff30c5fd1d3"
}
```

### 2- Substitua o arquivo, array-query.json, pela collection criada no exercício anterior e repita a busca porém utilizando o schema do mongoose:

> No arquivo `user-model.js` acrescentei apenas o método para o retrieve.

```js
// user-model.js
'use strict'

require("./db-config");
const UserSchema = require('./schema');
const UserModel = require('./model')("Usuarios",UserSchema);

const callback = (err, data, res) => {
  if (err) return res.status(400).send(err);
  res.json(data);
};

const CRUD = {
  create : (res, user) => {
    UserModel.create(user, (err, data) => callback(err, data, res));
  }
  , retrive : (res, query) => {
    UserModel.find(query, (err,data) => callback(err,data, res));
  }
}

module.exports = CRUD;
```

```js
// ex02.js
'use strict'

const express = require('express');
const app = express();
const util = require('util');
const UserModel = require('./user-model');

 app.get('/find', (req,res) =>{
     const q = req.query.q;
     console.log(q);
     const query = {nome: q};
     UserModel.retrive(res, query);
 });

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});
```

```
Chamada: localhost:3000/find?q=gabriel
Retorno:
{
    "__v":0,
    "nome":"gabriel",
    "email":"gabrielsilva1956@gmail.com",
    "cpf":"12345678",
    "_id":"57869e24e6475ff30c5fd1ce"
}
```

### 3- Repita o exercício anterior utilizando xml e json na resposta:

```js
// ex03.js
'use strict'

const express = require('express');
const app = express();
const util = require('util');
const UserModel = require('./user-model');

app.get('/find', (req,res) =>{
     const q = req.query.q;
     const query = {nome: q};
     const type = req.get('Content-Type');
     UserModel.retrive(res, query, type);
});

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});
```

```
// XML
Chamada: localhost:3000/find?q=gabriel
Parametro cabeçalho: Content-Type = text/xml
Retorno:
<user>
    <nome>Gabriel</nome>
    <email>gabrielsilva1956@gmail.com</email>
    <cpf>12345678</cpf>
</user>

// JSON
Chamada: localhost:3000/find?q=gabriel
Parametro cabeçalho: Content-Type = application/json
Retorno:
[
  {
    "_id": "57869e24e6475ff30c5fd1ce",
    "nome": "gabriel",
    "email": "gabrielsilva1956@gmail.com",
    "cpf": "12345678",
    "__v": 0
  }
]
```

### 4- Usando o formulário no index.html de exemplo use o body-parser como middleware para gravar registros no mongo:

> Sapoarr me lembrou as aulas de Angular1 :smile:

```js
// ex04.js
'use strict'

const express = require('express');
const app = express();
const fs = require('fs');
const bodyParser = require('index');
const UserModel = require('./user-model');

app.use(bodyParser.json()); // transformar em json
app.use(bodyParser.urlencoded({extended : true}));
 app.post('/user', (req,res) =>{
    UserModel.create(res,req.body);
 });

  app.get('/', (req,res) =>{
     res.set('Content-type', 'text/html');
     fs.createReadStream('./index.html').pipe(res);
 });

app.listen(3000, () => {
  console.log('Servidor rodando na porta 3000');
});
```

```html
<!DOCTYPE html>
<html>
<head>
  <title>Usuários</title>
</head>
<body>
  <form action="/user" method="post">
    <label>Name: </label>
    <input type="text" name="nome" value="" id="nome">
    <br/>
    <br/>
    <label>Email: </label>
    <input type="text" name="email" value="" id="email">
    <br/>
    <br/>
    <label>CPF: </label>
    <input type="text" name="cpf" value="" id="cpf">
    <br/>
    <br/>
    <button type="submit">Enviar</button>
  </form>
</body>
</html>
```
> Criei um `user` com os seguintes dados no formulário do arquivo `.html`:

```json
Retorno:
{
   "__v":0,
   "nome":"teste",
   "email":"seu@email.com",
   "cpf":"12345678",
   "_id":"5786a5b62d7fc6fa8d4cdb30"
}
```

### 5- Usando o index-file.html de exemplo, que usa o formidable, modifique-o de forma que o caminho da imagem que foi gravada no disco, seja gravado no mongodb, na colection users:

> No meu `schema.js` adicionei o atributo `imagem` e criei o arquivo `index-file.html` como pedido:

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Index</title>
</head>
<body>
  <form action="/upload" method="POST" enctype="multipart/form-data">
    <label>Nome: </label>
    <input type="text" name="nome" value="" id="nome">
    <br/>
    <br/>
    <label>Email: </label>
    <input type="text" name="email" value="" id="email">
    <br/>
    <br/>
    <label>CPF: </label>
    <input type="text" name="cpf" value="" id="cpf">
    <br/>
    <br/>
    <label>Imagem: </label>
    <input type="file" name="image" value="" id="image">
    <br/>
    <br/>
    <button type="submit">Enviar</button>
  </form>
</body>
</html>
```

> O `formidable` possui uma variável que se chama `fields` que eu vou utilizar para pegar os campos nome, email e cpf. Assim como o `fields` existe o `files` que traz as informações de todos os arquivos enviados pelo formulário.

```js
// ex05.js
'use strict'

const express = require('express');
const app = express();
const fs = require('fs');
const bodyParser = require('body-parser');
const formidable = require('formidable');
const UserModel = require('./user-model');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.post('/upload', (req, res) => {
  const form = new formidable.IncomingForm();
  form.uploadDir = './public/images';

  form.parse(req, (err, fields, files) => {
    const user = {nome: fields.nome, email: fields.email, cpf: fields.cpf, imagem: files.image.path};
    //console.log(user);
    UserModel.create(res,user);
  });
});

app.get('/', (req, res) => {
  res.set('Content-type', 'text/html');
  fs.createReadStream('./index-file.html').pipe(res);
});

app.listen(3000, () => {
  console.log("Servidor sendo executado na porta 3000");
});
```

```
Retorno:
{
   "__v":0,
   "nome":"gabrielzao",
   "email":"gabriel@web.com",
   "cpf":"12345678",
   "imagem":"public/images/upload_8b0e77fbe06d90057869e2",
   "_id":"5786975b69165ba2e6120780"
}
```

### Parte 02

### 1 - Criar as 4 rotas para o CRUD

```js
// ex06.js
'use strict'

require ('./db-config');
const express = require('express');
const app = express();
const router = express.Router(); //cria objeto router para redirecionar as requisiçoes para o destino correto.
const UserModel = require('./user-model');
const querystring = require('querystring');
/*
No all nunca utilize funcoes de retorno de algum dado ou modifiquem o formulário.
 */
router.all('*',(req,res,next) => { // router.all é executado para todos os verbos http.
	res.setHeader('Webschool', 'FODA');
  console.log('all');
	next();
});

router.post('/new', (req, res) => {
	var body = [];
	req.on('data', function(chunk) {
 		body.push(chunk);
	}).on('end', function() {
  	body = Buffer.concat(body).toString();
  	const obj = querystring.parse(body);
		UserModel.create(res, obj);
	});
});

router.get('/find', (req,res) =>{
     const q = req.query.q;
     //console.log(q);
     const query = {nome: q};
     const type = req.get('Content-Type');
     UserModel.retrive(res, query, type);
});

router.put('/:id', (req,res) => {
	const id = req.params.id;
	var body = [];
	req.on('data', function(chunk) {
 		body.push(chunk);
	}).on('end', function() {
  	body = Buffer.concat(body).toString();
  	const obj = querystring.parse(body);
  	UserModel.update(res,{"_id": id}, obj);
	});
});

router.delete('/:id', (req,res) => {
	const id = req.params.id;
	UserModel.remove(res,{"_id": id});
});

app.use('/users', router);

app.listen(3000,() => {
	console.log('Servidor executando na porta 3000.');
});
```

```
// CREATE
Method: POST
Chamada: localhost:3000/users/new
Parametros x-www-form-urlencoded:
nome: Internet Explorer
email: explorer@windows.com
cpf: 12345678

Resultado:
{
  "__v": 0,
  "nome": "Internet Explorer",
  "email": "explorer@windows.com",
  "cpf": "12345678",
  "_id": "5786b2562d7fc6fa8d4cdb31"
}
// FIND
Method: GET
Chamada: localhost:3000/find?q=gabriel
Parametro cabeçalho: Content-Type = json
Retorno:
{
    "__v":0,
    "nome":"gabriel",
    "email":"gabrielsilva1956@gmail.com",
    "cpf":"12345678",
    "_id":"57869e24e6475ff30c5fd1ce"
}

// UPDATE
Method: PUT
Chamada: localhost:3000/user/5786a5b62d7fc6fa8d4cdb30
Parametros x-www-form-urlencoded:
nome: teste

Retorno:
{
  "ok": 1,
  "nModified": 1,
  "n": 1
}

// DELETE
Method: DELETE
Chamada: localhost:3000/user/5786b2562d7fc6fa8d4cdb31
Parametros: n/a

Retorno:
{
  "ok": 1,
  "n": 1
}
```

### 2 - Criar a arquitetura atomica do Mongoose (Organismo/Ações/Molécula/Átomos/Quarks).

> Aqui também não vou passar a "desgraça" dos arquivos, são grandes demais e não dá pra resumir, se resumir minha cabeça explode.
Mas postarei só o resultado que ocorreu como desejado :smile: :heart:

> Bem, abaixo serão mostrados, livros que eu importei de um .json (encontrado na Deep Web rsrs) e importei para a collection `books` e deu no que deu...

```
// CREATE
METHOD: GET
URL: http://localhost:3000/create

Retorno:
[
  {
    "id" : "978-1933988177",
    "cat" : ["book","paperback"],
    "name" : "Lucene in Action, Second Edition",
    "author" : "Michael McCandless",
    "genre_s" : "IT",
    "inStock" : true,
    "price" : 30.50,
    "pages_i" : 475
  },
    {
    "id" : "978-0641723445",
    "cat" : ["book","hardcover"],
    "name" : "The Lightning Thief",
    "author" : "Rick Riordan",
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 12.50,
    "pages_i" : 384
  },
    {
    "id" : "978-1423103349",
    "cat" : ["book","paperback"],
    "name" : "The Sea of Monsters",
    "author" : "Rick Riordan",
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 6.49,
    "pages_i" : 304
  }
]

// FIND
METHOD: GET
URL: http://localhost:3000/find

Retorno:
[
     {
    "id" : "978-1857995879",
    "cat" : ["book","paperback"],
    "name" : "Sophie's World : The Greek Philosophers",
    "author" : "Jostein Gaarder",
    "genre_s" : "fantasy",
    "inStock" : true,
    "price" : 3.07,
    "pages_i" : 64
  }
]

// UPDATE
METHOD: GET
URL: http://localhost:3000/update

Retorno:
{
  "ok": 1,
  "nModified": 1,
  "n": 1
}

// DELETE
METHOD: GET
URL: http://localhost:3000/delete

Retorno:
{
  "ok": 1,
  "n": 1
}
```
> Acima no `UPDATE` pedi apenas para alterar o preço do livro The Lightning Thief com o ` "id" : "978-0641723445"`

### 3 - Integrar as funções do CRUD do Mongoose com o Express.
```js
// app.js
'use strict'

require ('./config/db-config');
const express = require('express');
const app = express();
const BookAPI = require('./routes-book');

app.use('/api/books', BookAPI);

app.listen(3000,() => {
  console.log('Servidor executando na porta 3000.');
});
```

```
// CREATE
METHOD: POST
URL: http://localhost:3000/api/books/new
BODY: x-www-form-urlencoded
key: cat        value: ["book","hardcover"]
key: name       value: Star Wars: Tarkin
key: author     value: James Luceno
key: genre_s    value: fantasy
key: inStock    value: true
key: price      value: 13,00
key: pages_i    value: 368

Retorno:
{
   "id":"978-8576572619",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Star Wars: Tarkin",
   "author":"James Luceno",
   "genre_s":"Fantasy",
   "inStock":true,
   "price":13.60,
   "pages_i":368
}
// UPDATE
METHOD: PUT
URL: http://localhost:3000/api/books/5786d6bd3ccdb6aa7894070a
BODY: x-www-form-urlencoded
key: author  value: J. K. Rowling

Retorno:
{
  "ok": 1,
  "nModified": 1,
  "n": 1
}
// FIND
METHOD: GET
URL: http://localhost:3000/api/books/find

Retorno:
{
   "_id":ObjectId("5786d3323ccdb6aa78940703"),
   "id":"978-0641723445",
   "cat":[
      "book",
      "hardcover"
   ],
   "name":"The Lightning Thief",
   "author":"Rick Riordan",
   "series_t":"Percy Jackson and the Olympians",
   "sequence_i":1,
   "genre_s":"fantasy",
   "inStock":true,
   "price":12.5,
   "pages_i":384
}{
   "_id":ObjectId("5786d3323ccdb6aa78940704"),
   "id":"978-1423103349",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"The Sea of Monsters",
   "author":"Rick Riordan",
   "series_t":"Percy Jackson and the Olympians",
   "sequence_i":2,
   "genre_s":"fantasy",
   "inStock":true,
   "price":6.49,
   "pages_i":304
}{
   "_id":ObjectId("5786d3323ccdb6aa78940705"),
   "id":"978-1857995879",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Sophie's World : The Greek Philosophers",
   "author":"Jostein Gaarder",
   "sequence_i":1,
   "genre_s":"fantasy",
   "inStock":true,
   "price":3.07,
   "pages_i":64
}{
   "_id":ObjectId("5786d3323ccdb6aa78940706"),
   "id":"978-1933988177",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Lucene in Action, Second Edition",
   "author":"Michael McCandless",
   "sequence_i":1,
   "genre_s":"IT",
   "inStock":true,
   "price":30.5,
   "pages_i":475
}{
   "_id":ObjectId("5786d6bd3ccdb6aa78940707"),
   "id":"978-8576572619",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Star Wars: Tarkin",
   "author":"James Luceno",
   "genre_s":"Fantasy",
   "inStock":true,
   "price":13.6,
   "pages_i":368
}{
   "_id":ObjectId("5786d6bd3ccdb6aa78940708"),
   "id":"978-8576572633",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Star Wars: Sombras do Império",
   "author":"Steve Perry",
   "genre_s":"fantasy",
   "inStock":true,
   "price":16.49,
   "pages_i":448
}{
   "_id":ObjectId("5786d6bd3ccdb6aa78940709"),
   "id":"978-8532511010",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Harry Potter E A Pedra Filosofal",
   "author":"J. K. Rowlng",
   "genre_s":"children",
   "inStock":true,
   "price":3.07,
   "pages_i":224
}{
   "_id":ObjectId("5786d6bd3ccdb6aa7894070a"),
   "id":"978-8532522610",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Harry Potter E As Relíquias Da Morte",
   "author":"J. K. Rowlng",
   "genre_s":"children",
   "inStock":true,
   "price":30.5,
   "pages_i":552
}
// FINDONE
METHOD: GET
URL: http://localhost:3000/api/books/5786d6bd3ccdb6aa7894070a

Retorno:
{
   "_id":ObjectId("5786d6bd3ccdb6aa7894070a"),
   "id":"978-8532522610",
   "cat":[
      "book",
      "paperback"
   ],
   "name":"Harry Potter E As Relíquias Da Morte",
   "author":"J. K. Rowlng",
   "genre_s":"children",
   "inStock":true,
   "price":30.5,
   "pages_i":552
}
// DELETE
METHOD: DELETE
URL: http://localhost:3000/api/books/5786d6bd3ccdb6aa7894070a

Retorno:
{
  "ok": 1,
  "n": 1
}
```

### 4 - Criar um módulo reponsável pelas respostas do sistema

> O arquivo abaixo é o meu antigo `callback.js`

```js
'use strict';
module.exports = (err,data,res,page,maxPages) => {
  if (err) {
    res.writeHead(404);
      res.end(err.toString());
    }
  res.writeHead(200, {'Content-Type': 'application/json'});
  return res.end(JSON.stringify(data));
};
```
### 5 - Criar um módulo responsável por tratar erros, primeiro parâmetro do callback das funções do Mongoose.

```js
// error.js
'use strict';
module.exports = (err,res) => {
    res.writeHead(404);
    return res.end(err.toString());
};
```

> Esse arquivo abaixo também é o meu `callback.js` antigo, porém melhorei ele para a chamada do módulo do erro, com a ajuda do meu amigo stackoverflow rsrs

```js
'use strict';
const error = require('./error');
module.exports = (err,data,res,page,maxPages) => {
  if (err) error(err,res);
  res.writeHead(200, {'Content-Type': 'application/json'});
  return res.end(JSON.stringify(data));
};
```

### Parte 03
Express Generator

### Criar um CRUD para User, o qual deve possuir os seguintes campos:
- email : String
- password: String
- createAt : Date

> Criar uma rota que deverá retornar apenas 1 usuário utilizando o seguinte padrão:
- router.get('/:id')

> Não coloquei os outros arquivos aqui, pois não quero meu markdown grande e difícil de enteder.

```js
// app.js
'use strict';

require('./config/db-config');
const express = require('express');
const path = require('path');
const favicon = require('serve-favicon');
const logger = require('morgan');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');

const routes = require('./routes/index');
const UsersApi = require('./modules/Users/routes');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/api/users', UsersApi);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
module.exports = app;
```

```
// CREATE
METHOD: POST
URL: http://localhost:3000/api/users/new
BODY: x-www-form-urlencoded
key: nome       value: gkal19
key: email      value: gabriel@gkal19.com
key: cpf        value: 12345678

Retorno:
{
  "__v": 0,
  "email": "gabriel@gkal19.com",
  "cpf": "12345678",
  "_id": "5786c12ab567d843ab13238e"
}

// UPDATE
METHOD: PUT
URL: http://localhost:3000/api/users/578697de69165ba2e6120784
BODY: x-www-form-urlencoded
key: cpf      value: 87654321

{
  "ok": 1,
  "nModified": 1,
  "n": 1
}

// FIND
METHOD: GET
URL: http://localhost:3000/api/users/find

Retorno:
{
  "_id": "5786975b69165ba2e6120780",
  "email": "gabrielsilva1956@gmail.com",
  "cpf": "12345678",
  "__v": 0
}

// FINDONE
METHOD: GET
URL: http://localhost:3000/api/users/5786978869165ba2e6120781

Retorno:
{
  "_id": "5786978869165ba2e6120781",
  "email": "vader@empire.net",
  "cpf": "12345678",
  "__v": 0
}

// DELETE
METHOD: delete
URL: http://localhost:3000/api/users/5786b2562d7fc6fa8d4cdb31

Retorno:
{
  "ok": 1,
  "n": 1
}
```


text:
# Node.js - Aula 03 - Exercício
**user:** [sergiokopplin](https://github.com/sergiokopplin)
**autor:** Sérgio Kopplin

## 1. Por que quando requisitamos ao nosso servidor de *Query String*, **com o Chrome**, ele executa 2 requisições, sendo a última "*vazia*"?
No Chrome a segunda requisição foi a de um favicon. O Status Code é 200 mas não existe conteúdo.

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

- **GET**: Get é enviado via URL e possui um limite. Ela é mais rápida, porém só comporta textos.
- **POST**: Enviada no corpo da requisição http e não possui limites no tamanho do pacote. Encapsulado para envio e pode conter qualquer tipo de dado.

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

**INCLUSÃO**
```BASH
node http-request-post.js
postData name=Sergio%20Kopplin&type=dev
Tamanho do postData 30
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"79","etag":"W/\"4f-S/dEhTwVZmMAZDqbvIBPQw\"","date":"Thu, 11 Feb 2016 00:05:56 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Sergio Kopplin","type":"dev","_id":"56bbd0647a041e110010a115"}
```

**ALTERAÇÃO**
```BASH
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-mQ0D9TTjH90glRZwHyt4GA\"","date":"Thu, 11 Feb 2016 00:08:03 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6249818581282848769","electionId":"565e25d106dca622271891c4"}}
```

## 4. **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: ''
});

const options = {
    host: 'webschool-io.herokuapp.com'
    , method: 'DELETE'
    , path: '/api/pokemons/56bbd0647a041e110010a115'
    , 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;
    });
};

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

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

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

## 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');

const options = {
    host: 'pokeapi.co'
    , path: '/api/v2/pokemon/'
};

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

    res.setEncoding('utf8');

    let dados = '';

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

    res.on('end', () => {
        let js = JSON.parse(dados);

        console.log(js[1]);

        console.log('<ul>');

        for(var i = 0; i < js.length; i++) {
            console.log('<li>' + js[i].name + '</li>');
        }

        console.log('<ul>');
    })
}

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

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

req.end();

```

*resultado*

```
node http-request.js
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Thu, 11 Feb 2016 01:15:06 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Cookie","x-frame-options":"SAMEORIGIN","allow":"GET, HEAD, OPTIONS"}
{ name: 'ivysaur', url: 'http://pokeapi.co/api/v2/pokemon/2/' }
<ul>
<li>bulbasaur</li>
<li>ivysaur</li>
...
<li>floette-eternal</li>
<li>latias-mega</li>
<li>latios-mega</li>
<ul>
```

repo_language: JavaScript

mime_type: text/plain


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

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

**autor:** Victor Igor

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

Porque na segunda requisição, ele solicita o 'favicon.ico' automaticamente.

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

- **GET**: Get é enviado via URL e possui um limite de 1024 caracteres, e caso seja ultrapassado, corre o risco da página dar erro.

- **POST**: O Post utiliza a URI para enviar as informações ao servidor, e não tem limite de capacidade de envio de informações e por isso acaba sendo melhor que o GET.

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

```js
/* CRIANDO POKEMON COM MEU NOME */

node class-03.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":"78","etag":"W/\"4e-N6xwBCDNRZ6CzrbPXljoNQ\"","date":"Sat, 05 Mar 2016 23:33:43 GMT","via":"1.1 vegur"}
Resultado: {"__v":0,"name":"Victor Igor","type":"aluno","_id":"56db6cd7bdff001100293034"}

/* ALTERANDO MEU POKEMON PELO MEU USE DO GITHUB*/

node class-03-alterandopokemon.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-w8IWqnhJfkE31t3yhBV3iQ\"","date":"Sat, 05 Mar 2016 23:37:19 GMT","via":"1.1 vegur"}
Resultado: {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6258716705548140545","electionId":"565e25d106dca622271891c4"}}

```

## 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/56db6f0abdff001100293035'
      };

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

  res.on('end', ()=>{
    console.log('Resultado: '+data);
  });
}

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

/* Resultado: */

node class-03-deletandopokemon.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sat, 05 Mar 2016 23:46:36 GMT","via":"1.1 vegur"}
Resultado:
```

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

```JS

node class-03-getAPI.js
STATUS: 200
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"5517","etag":"W/\"158d-c8PSQN++DR9ObSkS3s0RWA\"","date":"Sun, 06 Mar 2016 00:48:35 GMT","via":"1.1 vegur"}
Resultado: <html><body><div>[{"_id":"568c4f016b71ba1100229ee6","name":"Bilica","type":"professor","__v":0},{"_id":"56954df660679d11000236fe","name":"Bilica","type":"Zica da Balada","__v":0},{"_id":"56983d9d8446e71100c68842","name":"Bilica","type":"Aluno","__v":0},{"_id":"569c402d50a0f01100292c9e","name":"Bilica","type":"Aluno","__v":0},{"_id":"56ad3787200ef511003a086a","name":"Bilica","__v":0},{"_id":"56ae6ede18f5f71100b157c6","name":"Bilica","type":"developer","__v":0},{"_id":"56b09cc25ad7d111001ec9b8","name":"Bilica","type":"professor","__v":0},{"_id":"56b09f485ad7d111001ec9b9","name":"Bilica","type":"professor","__v":0},{"_id":"56b09f6a5ad7d111001ec9bb","name":"Bilica","type":"professor","__v":0},{"_id":"56b0ad877229a31100582ff4","__v":0,"name":"Bilica"},{"_id":"56b0ae837229a31100582ff5","__v":0,"name":"Bilica"},{"_id":"56b0afda7229a31100582ff6","__v":0,"name":"Bilica"},{"_id":"56b0b0be7229a31100582ff7","__v":0,"name":"Bilica"},{"_id":"56b0b12f7229a31100582ff8","__v":0,"name":"Bilica"},{"_id":"56b0b16b7229a31100582ff9","__v":0,"name":"Bilica"},{"_id":"56b0b1d17229a31100582ffa","__v":0,"name":"Bilica"},{"_id":"56b0b2007229a31100582ffb","__v":0,"name":"Bilica"},{"_id":"56b0b5af7229a3110</div><div>0582ffc","__v":0,"name":"Bilica"},{"_id":"56b0b6157229a31100582ffd","__v":0,"name":"Bilica"},{"_id":"56b0b6527229a31100582ffe","__v":0,"name":"Bilica"},{"_id":"56b0b6597229a31100582fff","__v":0,"name":"Bilica"},{"_id":"56b106be64a60411007c3e2b","__v":0,"name":"Bilica"},{"_id":"56b106cc64a60411007c3e2c","__v":0,"name":"Bilica"},{"_id":"56b106dd64a60411007c3e2d","__v":0,"name":"Bilica"},{"_id":"56b1089e64a60411007c3e2e","__v":0,"name":"Bilica"},{"_id":"56b246c5520ef61100b0d75b","name":"Bilica","type":"Analista S.","__v":0},{"_id":"56b32d4d8584471100d6ff1d","__v":0,"name":"Bilica"},{"_id":"56b32d4f8584471100d6ff1e","__v":0,"name":"Bilica"},{"_id":"56b3ea986cb772110086c190","name":"Bilica","type":"professor","__v":0},{"_id":"56b54c365795bb110075fbaf","name":"Bilica","type":"aluno","__v":0},{"_id":"56b6453c4f05f4110063ea08","name":"Bilica","type":"Aluno do Be Mean","__v":0},{"_id":"56b7cf047b9f54110011fa79","name":"Bilica","type":"Aluno","__v":0},{"_id":"56b7d6c97b9f54110011fa7a","name":"Bilica","type":"aluno","__v":0},{"_id":"56b7d7ed7b9f54110011fa7b","name":"Bilica","type":"aluno","__v":0},{"_id":"56b7ff3b510b5d110014a6ed","name":"Bilica","type":"Aluno","__v":0},{"_id":"56b80d35ff45d31100182507","name":"Bilica","type":"aluno","__v":0},{"_id":"56b8a337c636191100dea91c","__v":0,"name":"Bilica"},{"_id":"56b8a79bc636191100dea91e","name":"Bilica","type":"aluno","__v":0},{"_id":"56b8a982c636191100dea91f","name":"Bilica","type":"aluno","__v":0},{"_id":"56b8a9e0c636191100dea921","name":"Bilica","type":"aluno","__v":0},{"_id":"56b8c8eb56b97311007c7ebf","name":"Bilica","type":"professor","__v":0},{"_id":"56b8dcbd7586941100aaf254","name":"Bilica","type":"Professor","__v":0},{"_id":"56b8df8f7586941100aaf255","name":"Bilica","type":"Professor","__v":0},{"_id":"56ba0d6adaf4af110073de78","__v":0,"name":"Bilica"},{"_id":"56bb6c7b81fa011100369fc3","name":"Bilica","type":"Water","height":1.6,"__v":0},{"_id":"56bbbcc182124e110077f53e","name":"Bilica","type":"teacher","__v":0},{"_id":"56bbc22b82124e110077f53f","name":"Bilica","__v":0},{"_id":"56bbc25c82124e110077f540","name":"Bilica","__v":0},{"_id":"56bd1aa22c257311009b5723","name":"Bilica","type":"aluno","__v":0},{"_id":"56c0f66664bae31100ebb879","name":"Bilica","type":"Aluno","__v":0},{"_id":"56c1fca27d062611000a1113","name":"Bilica","type":"aluno","__v":0},{"_id":"56c1fdab7d062611000a1114","name":"Bilica","type":"fire","__v":0},{"_id":"56c333e192ca4e110026e8e8","name":"Bilica","type":"Loko dos Baguio","__v":0},{"_id":"56c466ab1b09dc11002f3b9a","name":"Bilica","type":"voador","__v":0},{"_id":"56c8cda4a0299011005601d3","name":"Bilica","type":"Aluno","__v":0},{"_id":"56c922da8583cb11008176a9","name":"Bilica","type":"professor","__v":0},{"_id":"56cb86c82847fb1100a035e4","__v":0,"name":"Bilica"},{"_id":"56cb88bb2847fb1100a035e5","__v":0,"name":"Bilica"},{"_id":"56cb89352847fb1100a035e6","__v":0,"name":"Bilica"},{"_id":"56cb89492847fb1100a035e7","__v":0,"name":"Bilica"},{"_id":"56cb895b2847fb1100a035e8","__v":0,"name":"Bilica"},{"_id":"56cb895e2847fb1100a035e9","__v":0,"name":"Bilica"},{"_id":"56cc86fcd7b91611009bfe4b","__v":0,"name":"Bilica"},{"_id":"56cc89f5d7b91611009bfe4c","__v":0,"name":"Bilica"},{"_id":"56cc8a30d7b91611009bfe4d","name":"Bilica","type":"Fat","__v":0},{"_id":"56cca9450f4ac811005fb173","name":"Bilica","type":"Fat","__v":0},{"_id":"56cd27e473a6431100ba1de9","name":"Bilica","type":"professor","__v":0},{"_id":"56ce4dca8423d41100c0a9dc","name":"Bilica","type":"professor","__v":0},{"_id":"56ce85ddac1315110043cffa","name":"Bilica","type":"professor","__v":0},{"_id":"56ce865aac1315110043cffb","name":"Bilica","type":"aluno","__v":0},{"_id":"56d1f4e5e7973e11003588ba","name":"Bilica","type":"professor","__v":0},{"_id":"56d1f61ce7973e11003588bb","name":"Bilica","type":"aluno","__v":0},{"_id":"56d3772f835b421100aaed6c","name":"Eduardo Garcia","type":"aluno","__v":0},{"_id":"56d4ae6361ebc311008a82d1","__v":0},{"_id":"56d4b37d61ebc311008a82d2","name":"Jean Nascimento","type":"professor","__v":0},{"_id":"56db63edbdff001100293031","name":"Victor Igor","type":"aluno","__v":0},{"_id":"56d610e1b9f4861100c2cd57","name":"Jack Baura","type":"maconheiro","__v":0},{"_id":"56d75a62654832110058d892","name":"Eduardo Garcia","type":"aluno","__v":0},{"_id":"56db6693bdff001100293033","name":"Guitarra Modificada","type":"stratocaster","__v":0}]</div></body></html>

```


text:
# Node.js - Aula 03 - Exercício
**user:** [lesilva00](https://github.com/lesilva00)
**autor:** Luís Eduardo Tenório Silva
**date:** 1456600950642

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

Em vários navegadores, a segunda requisição é realizada para requisitar o componente _favicon.ico_.

## Qual a DIFERENÇA entre o GET e o POST?
GET e POST são métodos utilizados no protocolo HTTP para realizar uma atividade específica.
O método GET é utilizado quando requisitamos alguma informação do servidor.
O método POST é utilizado quando desejamos inserir no servidor um ou mais dados.

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

### Criando o Pokemon

```js
'use strict';

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

const postData = querystring.stringify({
  name:'Luís Eduardo',
  type:'Aluno'
});

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 CODE: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));

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

  res.on('end', () => {
    console.log("Dados totais recebidos: " + data);
  });
}

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

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

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

```

Saída do Node.js

```
$ node http-post-execution.js
STATUS CODE: 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-qpBmZ7pdtUhKR33kqXXBzw\"","date":"Tue, 09 Aug 2016 14:10:24 GMT","via":"1.1 vegur"}
Dados totais recebidos: {"__v":0,"name":"Luís Eduardo","type":"Aluno","_id":"57a9e450d3285e1100a0deb8"}
```

###Editando o Pokemon

```js
'use strict';

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

const putData = querystring.stringify({
  name:'lesilva00'
});

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

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

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

  res.on('end', () => {
    console.log("Dados totais recebidos: " + data);
  });
}

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

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

request.write(putData);
request.end();

```

Saída do Node.js

```
$ node http-put-execution.js
STATUS CODE: 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-eWEgyhvz97x3SSsZRX7m0A\"","date":"Tue, 09 Aug 2016 14:17:38 GMT","via":"1.1 vegur"}
Dados totais recebidos: {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6316832848628154369","electionId":"576451dfece94f32689e021d"}}

```

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

```js
'use strict';

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

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

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

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

  res.on('end', () => {
    console.log("Dados totais recebidos: " + data);
  });
}

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

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

Saída do Node.js
```
STATUS CODE: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Tue, 09 Aug 2016 14:24:08 GMT","via":"1.1 vegur"}
Dados totais recebidos:
```

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

Utilizei a api do [Star Wars](http://swapi.co/api/people) após observar os exemplos dos meus colegas.

```js
'use strict';

const http = require('http');

const options = {
  host:'swapi.co',
  path:'/api/people/10',
  headers:{
    'Content-Type':'text/html'
  }
}

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

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

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

http.get(options,callback);
```

Resposta

```js
STATUS CODE: 301
HEADERS: {"date":"Tue, 09 Aug 2016 14:37:48 GMT","content-type":"text/html; charset=utf-8","transfer-encoding":"chunked","connection":"close","set-cookie":["__cfduid=d5018a39ef2846e3f8467399e75dee42e1470753468; expires=Wed, 09-Aug-17 14:37:48 GMT; path=/; domain=.swapi.co; HttpOnly"],"location":"http://swapi.co/api/people/10/","x-frame-options":"SAMEORIGIN","via":"1.1 vegur","server":"cloudflare-nginx","cf-ray":"2cfbf2bb35854a96-GRU"}

```


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

**autor:** Mauriene Firmino do Nascimento Júnior

**date:** 1476019304746

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

Por causa do favicon.ico

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

O GET faz uma requisição e retorna algo, o POST envia algo para a requisição.

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

**Criando um Pokemon**

```
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Mauriene Firmino do Nascimento Júnior'
      , type: 'Student'
      });
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('Error: ' + e.message);
});
req.write(postData);
req.end();

```

**Resultado do console**

```
mauriene@mauriene-J1800NH:~/node/exercicios$ node aula03.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":"107","etag":"W/\"6b-tGETF/Ww5/WtW30XSYBmQQ\"","date":"Sun, 09 Oct 2016 13:25:41 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Mauriene Firmino do Nascimento Júnior","type":"Student","_id":"57fa4555719eff00115a6f39"}
mauriene@mauriene-J1800NH:~/node/exercicios$

```

**Modificando**

```
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
        name: 'Mauriene Firmino Modificado'
      });
const options = {
        host: 'webschool-io.herokuapp.com'
      , method: 'PUT'
      , path: '/api/pokemons/57fa4555719eff00115a6f39'
      , 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('Error: ' + e.message);
});
req.write(postData);
req.end();

```

**Resultado do Console**

```
mauriene@mauriene-J1800NH:~/node/exercicios$ node aula03-update.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":"121","etag":"W/\"79-zxawyjvjaCchay4+sweRcw\"","date":"Sun, 09 Oct 2016 13:30:28 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"opTime":{"ts":"6339456889507545089","t":0},"electionId":"7fffffff0000000000000000"}}
mauriene@mauriene-J1800NH:~/node/exercicios$

```

## **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/57fa4555719eff00115a6f39'
      , 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('Error: ' + e.message);
});
req.end();
```

**Resultado do Console**

```
mauriene@mauriene-J1800NH:~/node/exercicios$ node aula03-delete.js
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sun, 09 Oct 2016 13:33:22 GMT","via":"1.1 vegur"}
Dados finalizados:
mauriene@mauriene-J1800NH:~/node/exercicios$

```

## 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 json2html = require('node-json2html');

const options = {
    host: 'pokeapi.co'
    , path: '/api/v2/pokemon/'
};
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':'${name} - url: ${url}'};
        var html = json2html.transform(data,transform);
        console.log(html);
    });
}

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

```


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

**autor:** Matheus José Krumenauer Weber

**date:** 1456600950642

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

Ele envia a segunda requisição porque ele está requisitando o favicon.

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

O GET é utilizado para quando queremos acessar alguma informação no servidor, outra coisa, o mesmo é visualizado através da url(a querystring após o endereço do servidor), e só pode enviar texto.

O POST é utilizado para quando queremos gravar alguma informação no servidor, pode enviar diversos tipos de dados(texto, arquivos, etc...).

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

Criando o Pokemon

```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":"96","etag":"W/\"60-KBGEvOm+tN4IZCOXBi7JbA\"","date":"Sat, 27 Feb 2016 19:25:42 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Matheus Jose Krumenauer Weber","type":"aluno","_id":"56d1f836e7973e11003588bc"}

```

Editando o Pokemon

```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-Q0c57XIKE+tyOOl5YY+7yA\"","date":"Sat, 27 Feb 2016 19:27:09 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6256054641868406785","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":"Sat, 27 Feb 2016 19:27:53 GMT","via":"1.1 vegur"}

```

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

Utilizei a api do pokeapi.co.
```js
'use strict';

const http = require('http');
const json2Html = require('node-json2html')
http.get({
  hostname: 'pokeapi.co',
  path: '/api/v2/pokemon/137/',
  agent: false

}, (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 html = json2html.transform(body, {"tag": "div","id": "${id}","html": "${name}"});

       console.log(html);
    });
});
```

Resposta

```js
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Sat, 27 Feb 2016 19:36:56 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Cookie","x-frame-options":"SAMEORIGIN","allow":"GET, HEAD, OPTIONS"}
<div id="137">porygon</div>
```


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

**autor:** Vitor Capretz

**date:** 1465911866403

## 1. Por que quando requisitamos ao nosso servidor de Query String, com o Chrome, ele executa 2 requisições, sendo a última "vazia"?
Isso pode ser facilmente entendido apenas abrindo a aba Network no navegador: ao abrir o localhost com a porta onde o Node está sendo executado e com os parâmetros na Querystring, é possível visualizar duas requisições.

Uma delas é efetivamente a requisição passando os parâmetros da Querystring, mas a segunda é uma requisição no path "/favicon.ico", e esta não possui parâmetros na Querystring, resultando em um print vazio no console do Node.

## 2. Qual a diferença entre o `GET` e o `POST`?
* GET - além de passarmos os parâmetros via URL, ele é usado em uma API para as buscas no banco de dados.
* POST - nele os parâmetros são enviados via form (Content-Type: "application/x-www-form-urlencoded") e no desenvolvimento de uma API, é utilizado para inserção de dados.

## 3. Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
#### Inserção
```js
'use strict';

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

const postData = queryString.stringify({
    name: 'Vitor Capretz',
    type: 'student'
});

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

let 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('data completed: ', data);
    });
}

const req = http.request(options, callback);
req.on('error', e => {
    console.log('ops, deu esse erro aqui: ', e.message);
});

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

```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/http$ 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":"82","etag":"W/\"52-iFuBRJjN4Q5qLRmix8A8cw\"","date":"Tue, 14 Jun 2016 14:11:58 GMT","via":"1.1 vegur"}
data completed:  {"__v":0,"name":"Vitor Capretz","type":"student","_id":"576010aeebf517110060cadb"}
```

#### Alteração
```js
'use strict';

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

const postData = queryString.stringify({
    name: 'vitorcapretz'
});

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

let 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('data completed: ', data);
    });
}

const req = http.request(options, callback);
req.on('error', e => {
    console.log('ops, deu esse erro aqui: ', e.message);
});

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

```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/http$ 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-AiMYwinMu+qHyurLRUAifA\"","date":"Tue, 14 Jun 2016 14:13:49 GMT","via":"1.1 vegur"}
data completed:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6296051095315677185","electionId":"56ee12f2563048036a1e77e7"}}
```

## 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/575de43cda6e731100bfdad5'
};

let 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('data completed: ', data);
    });
}

const req = http.request(options, callback);
req.on('error', e => {
    console.log('ops, deu esse erro aqui: ', e.message);
});

req.end();
```

```
vitor@vitor-ThinkPad-T440:/var/www/html/workshop-be-mean/nodejs/http$ node http-request-delete.js
status: 204
headers:  {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Tue, 14 Jun 2016 14:16:12 GMT","via":"1.1 vegur"}
data completed:
```

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

```js
'use strict';

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

https.get({
    hostname: 'www.udacity.com',
    path: '/public-api/v0/courses',
    agent: false
}, res => {
    let body = '';
    console.log('status: ' + res.statusCode);
    console.log('headers: ', res.headers);
    res.on('data', function(data) {
        body += data;
    });

    res.on('end', function() {
        createServer(body);
    });
});

let createServer = (data) =>{
    const dados_curso = JSON.parse(data).courses;

    http.createServer((request, response) => {
        response.writeHead(200, {'Content-Type': 'text/html'});
        let body_html = "<h2> Cursos do uDacity </h2> <ul>";
        for(let key in dados_curso){
            body_html += "<li> nome do curso: " + dados_curso[key].title + "</li>";
        }

        body_html += "</ul>";
        response.write(body_html);

        response.end();
    }).listen(3000, function(){
        console.log('aguardando na porta 3000');
    });
}
```


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

**autor:** Angelo Rogério Rubin

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

Isso ocorre no *Chrome* porque além da primeira requisição, também é feita uma segunda para o favicon.

Eu creio que não chega a ser um 'problema', pode ser contornado com o seguinte código:

	'use strict';

	let http = require('http')
	  , url = require('url');

	http.createServer(function(request, response){

	    if(request.url === '/favicon.ico') {
	        response.writeHead(404);
	        response.end();
	    }
	    else {

	        var result = url.parse(request.url, true);

	        response.writeHead(200, {"Content-Type": "text/html"});
	        response.write("");
	        response.write("
Be - MEAN
");
	        response.write("
Query string
");
	        response.write("
");

	        console.log(result.query);

	        for(var key in result.query){
	        response.write("
"+key+" : "+result.query[key]+"
");
	        }

	        response.write("
");
	        response.write("");
	    }

	    response.end();

	}).listen(3000, function(){
	  console.log('Servidor rodando em localhost:3000');
	});

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

* **GET**
  - As informações são enviadas como `String` anexada a `URL`
  - Limite de tamanho da mensagem a ser enviada
  - Envia somente `String`
  - Informações enviadas ficam em `cache`

* **POST**
  - As informações são encapsuladas junto ao corpo da requisição `HTTP` e não podem ser vistas na `URL`
  - Sem limites de comprimento da mensagem enviada
  - Envia qualquer tipo de dados
  - As informações enviadas **NÃO** ficam gravadas em `cache`

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

	PS C:\Projetos\nodejs> node http-request-post.js
	postData name=Angelo%20Rubin&description=scravus%20assalariadus&type=ajudant
	&height=1.85&defense=300
	Tamanho do postData 135
	STATUS: 201
	HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","a
	e":"application/json; charset=utf-8","content-length":"170","etag":"W/\"aa-V
	 2015 17:29:12 GMT","via":"1.1 vegur"}
	Dados(s) postado(s):  {"__v":0,"name":"Angelo Rubin","description":"scrav
	e de pedreiro","attack":100,"height":1.85,"_id":"5672f0e807bbbe11004259f0"}

	PS C:\Projetos\nodejs> node http-request-put.js
	STATUS: 202
	HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-typ
	e":"application/json; charset=utf-8","content-length":"108","etag":"W/\"6c-UZYkXWB4GWoROquknoOGcw\"","date":"Thu, 17 Dec
	 2015 17:32:42 GMT","via":"1.1 vegur"}
	Dado(s) atualizado(s):  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6229307015773028353","electionId":"565e25d106dca62
	2271891c4"}}

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

	PS C:\Projetos\nodejs> node http-request-delete.js
	STATUS: 204
	HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-or
	gin":"*","date":"Thu, 17 Dec 2015 17:35:11 GMT","via":"1.1 vegur"}
	Dado(s) deletado(s):

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

**Script

	'use strict';

	const http = require('http');

	http.get({
	    host:'api.redtube.com'
	    , path: '/?data=redtube.Videos.searchVideos&search=Anjelica'
	}, (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() {

	        let data = JSON.parse(body);

	        console.log('
');

	        for (var i = 0, titles = Object.keys(data.videos[0].video).length; i <= titles; i++) {
	            console.log('
 ' + data.videos[i].video.title + '
');
	        }

	        console.log('
');

	    });

	});

**API externa escolhida (api.redtube.com)

	PS C:\Projetos\nodejs> node http-get-redtube.js
	STATUS: 200
	HEADERS: {"server":"nginx","date":"Fri, 18 Dec 2015 12:45:31 GMT","content-type":"application/json;charset=utf-8","trans
	fer-encoding":"chunked","connection":"close","set-cookie":["PHPSESSID=62aemcu01o7e411ctie15mg673; path=/"],"expires":"Th
	u, 19 Nov 1981 08:52:00 GMT","cache-control":"no-store, no-cache, must-revalidate, post-check=0, pre-check=0","pragma":"
	no-cache"}

 Breakfast In Bed - Anjelica

 Quartet - Anjelica, Maria, Lola, Tess

 Anal passion and pain

 Jb Teen Sodomy 04 - 002

 garota muito safada

 Krystal Boyd,,Slammed

 Burn My Passion - Anjelica

 Krysta

 Stunning Anjelica masturbates to orgasm

 Krystal Boyd

 Big ass pussy ball sucking

 Gorgeous model ballslicking

 Abbie christmas Anal

 Natural tits teenie buttfucking


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

**autor:** rony souza

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

Porque 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

### 2. 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.

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

```
'use strict'

const http = require('http')
    , queryString = require('querystring')
    , postData = queryString.stringify({
        name: 'Ronyclay barreto de souza'
        , type: 'aluno'
    })
    , options = {
        host: 'webschool-io.herokuapp.com'
        , method: 'post'
        , path: '/api/pokemons'
        , headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
            , 'Content-Length': postData.length
        }
    };

var req = http.request(options, res => {
    let chunck = '';

    res.on('data', data => chunck += data);

    res.on('end', () => console.log('Fim!'));
})

req.on('error', e => console.log('Erro!' + e));

req.write(postData);

req.end();
```

```
'use strict'

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

var req = http.request(options, res => {
    let chunck = '';

    res.on('data', data => chunck += data);

    res.on('end', () => console.log('Fim!'));
})

req.on('error', e => console.log('Erro!' + e));

req.write(postData);

req.end();
```

### 4. 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/56b80d13ff45d31100182506',
	};

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();
```
### 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');
var RESP = {
  name: 'resposta'
};

http.get({
  hostname : 'pokeapi.co',
  path: '/api/v2/language/4/',
},(response) => {
    let body = "";
    console.log('STATUS:'+ response.statusCode);
    console.log(response.headers);

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

    response.on('end', function(){
       RESP.result = JSON.parse(body).name;
    });
});

http.createServer((request, response)=>{
  response.writeHead(200, {'Content-Type': 'text/html'});
  response.write('<h1>'+RESP.result+'<h1>');
  response.end();
}).listen(3000, function(){
  console.log('rodando nas porta 3000');
});
```


text:
# Node.js - Aula 03 - Exercício
**user:** charles7421
**autor:** Charles de Freitas Garcia

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

É um bug conhecido, sempre envia 2 requisições. Uma originalmente do URL requisitada e uma do Favicon.ico da URL originalmente requisitada. No Chorme, acontece sempre 2 requisições, já no Firefox, somente na primeira vez.

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

GET solicita algum recurso ou arquivo da URL no caso.
POST envia dados para ser processados e/ou inseridos.

Resumidamente, GET é pra pegar do servidor, e POST é pra inserir no servidor.

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

```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
		name: 'Charles de Freitas Garcia'
	});
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('Erro:' + e.message);
});
req.write(postData);
req.end();
```

Modificando ...

```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
		name: 'charles7421'
	});
const options = {
		host: 'webschool-io.herokuapp.com',
		method: 'PUT',
		path: '/api/pokemons/56fc80391333451100ec3524',
		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();

```

## **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/56fc8b1823545b11006d8868',
	};

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();
```

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

Acesso a API Star Wars
http://swapi.co/api/people/1/

```js

'use strict';

const http = require('http');

const options = {
	host: 'swapi.co',
	method: 'GET',
	path: '/api/people/1/'
};

function callback(res) {
	console.log('STATUS:' + res.statusCode);
	console.log('HEADERS:' + 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();

```

```html
STATUS:200
HEADERS:[object Object]
Dados finalizados: {
    "name": "Luke Skywalker",
    "height": "172",
    "mass": "77",
    "hair_color": "blond",
    "skin_color": "fair",
    "eye_color": "blue",
    "birth_year": "19BBY",
    "gender": "male",
    "homeworld": "http://swapi.co/api/planets/1/",
    "films": [
        "http://swapi.co/api/films/6/",
        "http://swapi.co/api/films/3/",
        "http://swapi.co/api/films/2/",
        "http://swapi.co/api/films/1/",
        "http://swapi.co/api/films/7/"
    ],
    "species": [
        "http://swapi.co/api/species/1/"
    ],
    "vehicles": [
        "http://swapi.co/api/vehicles/14/",
        "http://swapi.co/api/vehicles/30/"
    ],
    "starships": [
        "http://swapi.co/api/starships/12/",
        "http://swapi.co/api/starships/22/"
    ],
    "created": "2014-12-09T13:50:51.644000Z",
    "edited": "2014-12-20T21:17:56.891000Z",
    "url": "http://swapi.co/api/people/1/"
}

```


text:
# NodeJS - Aula 03 - Exercício
autor: Wellerson Roberto

## 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 Google Chrome é a requisição pra buscar o favicon.ico.

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

Os verbos **GET** e **POST** são usados para propósitos distintos. Enquanto o **GET** é usado para requisitar dados, o **POST** é usado para enviar dados para o servidor. Outras diferenças:

* O **GET** envia os dados pela URL, portanto é menos seguro. O **POST** faz o envio pelo **body** da requisição.
* O **GET** pode ser cacheado e ficar no histórico do navegador, o **POST** não.
* Como os dados do **GET** são enviados pela URL, ele fica limitado ao tamanho da URL. Por **POST** não.

## 3) Crie um POKEMON na nossa API com o seu nome, depois modifique seu nome pelo User do GitHub, colocando aqui a resposta de cada passo.

```
'use strict'

const http = require('http')
    , queryString = require('querystring')
    , postData = queryString.stringify({
        name: 'Wellerson Roberto Alves Nobrega'
        , type: 'aluno'
    })
    , options = {
        host: 'webschool-io.herokuapp.com'
        , method: 'post'
        , path: '/api/pokemons'
        , headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
            , 'Content-Length': postData.length
        }
    };

var req = http.request(options, res => {
    let chunck = '';

    res.on('data', data => chunck += data);

    res.on('end', () => console.log('Fim!'));
})

req.on('error', e => console.log('Erro!' + e));

req.write(postData);

req.end();
```

```
'use strict'

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

var req = http.request(options, res => {
    let chunck = '';

    res.on('data', data => chunck += data);

    res.on('end', () => console.log('Fim!'));
})

req.on('error', e => console.log('Erro!' + e));

req.write(postData);

req.end();
```

## 4) Depois faça o DELETE, criado o script para tal, colocando aqui a resposta.

```
'use strict'

const http = require('http')
    , options = {
        host: 'webschool-io.herokuapp.com'
        , method: 'delete'
        , path: '/api/pokemons/56b80d13ff45d31100182506'
    };

var req = http.request(options, res => {
    let chunck = '';

    res.on('data', data => chunck += data);

    res.on('end', () => console.log('Fim!'));
})

req.on('error', e => console.log('Erro!' + e));

req.end();
```

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

```
'use strict';

const http = require('http');

const app = {
    createServer: () => {
        this.server = http.createServer((req, response) => {
            response.writeHead(200, { 'Content-Type': 'text/html' });
            http.get(app.optionsRequest, res => {
                let data = '';

                res.on('data', chunck => data += chunck);

                res.on('end', () => {
                    var json = JSON.parse(data)
                        , html = app.htmlHelper.build(json.data);
                    response.write(html);
                    response.end();
                });
            });
        });
    },
    htmlHelper: {
        build: (data) => {
            var html = '';
            html += app.htmlHelper.buildHeader();
            html += app.htmlHelper.buildBody(data);
            html += app.htmlHelper.buildFooter();
            return html;
        },
        buildHeader: () => {
            var html = '<!doctype html>' +
                '<html>' +
                '<head>' +
                '<meta charset="utf-8">' +
                '<title>Usando a API do Deezer!</title>' +
                '</head>' +
                '<body>'
            return html;
        },
        buildBody: data => {
            var html = ''
                , i = 0
                , length = 0;
            for (i = 0, length = data.length ; i < length; i++) {
                html += '<div>' +
                    '<p>' + data[i].title + '</p>' +
                    '<img src="' + data[i].album.cover + '"/>' +
                    '<audio controls><source src="' + data[i].preview + '" type="audio/mpeg" preload="none"/></audio>' +
                    '</div></hr>';

            };
            return html;
        },
        buildFooter: () =>{ return '</body></html>' }
    },
    optionsRequest: {
        hostname: 'api.deezer.com',
        path: '/search?q=eminem'
    },
    listen: () => this.server.listen(3000, () => console.log('Estou pronto!')),
    server: null
};

app.createServer();
app.listen();
```


text:
# Node.js - Aula 03 - Exercício
**user:** [lucasduarte](https://lucasduarte.github.io)
**autor:** Lucas Duarte Anício

## 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 extra é executada a fim de obter o "favicon"

## Qual a DIFERENÇA entre o GET e o POST?
**GET** Serve para requisitar dados de uma determinada aplicação
**POST** É utilizado para submeter dados que posteriormente serão processados pela aplicação

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

**Código Criação**
```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
  name: 'Lucas Duarte',
  type: 'aluno'
});

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('ERRO: ' + e.message);
});

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

```

**Resultado**
```
STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"79","etag":"W/\"4f-y2YhmPP6F7gUftFszWtHnQ\"","date":"Fri, 01 Apr 2016 23:19:03 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Lucas Duarte","type":"aluno","_id":"56ff01e72ac29c1100ab422f"}
```

**Código Alteração**
```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
  name: 'Lucas Duarte Anicio',
});

const options = {
    host: 'webschool-io.herokuapp.com'
  , method: 'PUT'
  , path: '/api/pokemons/56ff01e72ac29c1100ab422f'
  , 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();

```

**Resultado**
```
STATUS: 202
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-Qb9Gax1+1bghS2ST/U8Bkg\"","date":"Fri, 01 Apr 2016 23:25:11 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":0,"n":1,"lastOp":"0","electionId":"56ee12f2563048036a1e77e7"}}
```

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

**Código**
```js
'use strict';

const http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
});

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

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();

```

**Resultado**
```
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Fri, 01 Apr 2016 23:28:02 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**.

**Código**
```js
'use strict';

const http = require('http');

const options = {
    host: 'correiosapi.apphb.com'
  , path: '/cep/76873274'
};

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();

```

**Resultado**
```
STATUS: 200
HEADERS: {"server":"nginx","date":"Fri, 01 Apr 2016 23:31:09 GMT","content-type":"application/json; charset=utf-8","content-length":"120","connection":"close","cache-control":"no-cache","pragma":"no-cache","expires":"-1"}
Dados finalizados:  {"cep":"76873274","tipoDeLogradouro":"Rua","logradouro":"Juriti","bairro":"Setor 02","cidade":"Ariquemes","estado":"RO"}

```


text:
## Node.js - Aula 03 - Exercício
**user:** tuchedsf - https://github.com/tuchedsf
**autor:** Diego Santos Ferreira

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

Pois o comportamento do chrome é sempre após processar uma requisição, ele efetuar outra requisição para recuperar o favicon.ico do site.

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

Os dois métodos são utilizados para fazer requisição ao servidor, sendo a principal diferença a visibilidade, uma vez que o get utiliza a própria url para passagem de parâmetros enquanto o post encapsulada junto ao corpo da requisição os parâmetros e não é visível.
As requisições get geralmente são utilizadas ao requisitar algum recurso geralmente para leitura, já as requisições post são mais utilizadas para passar parâmetros e realizar uma requisição de atualização de dados etc. Uma requisição get também por utilizar da url possui uma limitação de 1024 caracteres.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
```
MacBook-Air-Diego:nodejs diego$ node http-create-pokemon.js
postData name=Diego%20Ferreira&type=turtle
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-2IF24hW3OLiEBLEVp0CKdA\"","date":"Sun, 28 Feb 2016 11:49:39 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Diego Ferreira","type":"turtle","_id":"56d2ded2fb64951100bc36de"}
```

##### Conferencia API
```
http://webschool-io.herokuapp.com/api/pokemons/56d2ded2fb64951100bc36de

{
  "_id": "56d2ded2fb64951100bc36de",
  "name": "Diego Ferreira",
  "type": "turtle",
  "__v": 0
}

```

#### Alteração Pokemon:
```
MacBook-Air-Diego:nodejs diego$ node http-alter-pokemon-api.js
postData name=tuchedsf&type=turtle
Tamanho do postData 25
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-9YlCYIxXYr/SQVQ13QTnEg\"","date":"Sun, 28 Feb 2016 12:03:00 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6256311270459310082","electionId":"565e25d106dca622271891c4"}}
```

##### Conferencia API
```
http://webschool-io.herokuapp.com/api/pokemons/56d2ded2fb64951100bc36de

{
  "_id": "56d2ded2fb64951100bc36de",
  "name": "tuchedsf",
  "type": "turtle",
  "__v": 0
}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```
MacBook-Air-Diego:nodejs diego$ node http-delete-pokemon-api.js
postData name=tuchedsf&type=turtle
Tamanho do postData 25
STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Sun, 28 Feb 2016 12:08:53 GMT","via":"1.1 vegur"}
Dados finalizados:
```
##### Conferencia API
```
http://webschool-io.herokuapp.com/api/pokemons/56d2ded2fb64951100bc36de

null
```

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

API: http://postmon.com.br/ -> consulta cep

```
MacBook-Air-Diego:nodejs diego$ node http-get-fipe-api-2.js
STATUS: 200
HEADERS: {"date":"Tue, 01 Mar 2016 01:21:54 GMT","content-type":"application/json","content-length":"278","connection":"close","set-cookie":["__cfduid=db7fb08890a2bca695abcae005db5bebe1456795314; expires=Wed, 01-Mar-17 01:21:54 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":"Thu, 31 Mar 2016 01:21:54 GMT","server":"cloudflare-nginx","cf-ray":"27c8cb7d762b385e-ATL"}
<html><body><h1>Dados do Endereço</h1><ul>
<li>bairro:Major Lage de Cima</li>
<li>cidade:Itabira</li>
<li>cep:35900394</li>
<li>logradouro:Rua Topázio</li>
<li>estado_info:[object Object]</li>
<li>cidade_info:[object Object]</li>
<li>estado:MG</li>
</ul></body></html>
```

## Bibliografia

http://marceloweb.info/principais-diferencas-entre-os-metodos-http-get-e-post/
http://professortorres.com.br/diferenca-entre-os-metodos-get-e-post/


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

**Autor:** Dânio Filho

**Date:** 1452720577119

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

O Chrome, além da requisição que foi solicitada, ele realiza uma requisição de um favicon. Como não passamos isso, ele retorna vazio.

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

** GET **

O GET foi feito para se enviar pedidos para receber informações de uma url, e é usado para enviar parâmetros via URL. Ele possui uma limitação de caracteres em seu envio de 1024 caracteres, o que torna o conteúdo bem limitado.

** POST **

Já o POST foi feito para enviar informações e não apenas consulta-las (como é o caso do GET). Os parâmetros não são enviados via url e o limite do POST é "ilimitado", sendo esse limite sendo apenas definido via servidor, o que geralmente garante o POST de bastante informação sem problema nenhum.

# 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.

~~~ js

//Criando o "Pokemon"

STATUS: 201
HEADERS: {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"78","etag":"W/\"4e-GtkDpHj2/UkF+JW96KfJcQ\"","date":"Wed, 13 Jan 2016 21:49:14 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Danio Filho","type":"aluno","_id":"5696c65a2f90f71100f42eca"}

//Removendo

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-BsH4onU2gQgfl729cawThQ\"","date":"Wed, 13 Jan 2016 21:52:44 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6239393325560889345","electionId":"565e25d106dca622271891c4"}}

~~~

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

~~~ js

//Excluindo

STATUS: 204
HEADERS: {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Wed, 13 Jan 2016 21:53:47 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.

~~~ js
//API
host: 'pokeapi.co',
path: '/api/v1/type/?limit=10&offset=1'

//Retorno
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Wed, 13 Jan 2016 23:35:29 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","vary":"Accept","x-frame-options":"SAMEORIGIN","cache-control":"s-maxage=360, max-age=360"}

Fighting

Flying

Poison

Ground

Rock

Bug

Ghost

Steel

Fire

Water

~~~


text:
# Node.js - Aula 03 - Exercício
**user:** [augustoody](https://github.com/AugustoOdy)
**autor:** Augusto Ody
**date:** 1455192829487

## 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 envia o `favicon.ico`, e a primeira é a requição feita.

## Qual a DIFERENÇA entre o GET e o POST?
**GET:** por seus parametros serem passados pela URL, são armazenados no histórico do navegador, por este mesmo motivo podem ser facilmente alterados e só aceitão caracteres ASCII. Alguns servidores podem acabar limitando o seu tamanho, aceitando uma URL de até 2048 caracteres.

**POST:** seus parametros não são salvos no historico, e podem ser enviados arquivos para o servidor. Não possuem restrição de tamanho, aceitando tambem tipos binários.

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

# Criação (POST)
```sh
postData name=Augusto%20Ody&type=aluno
postData.length 29
Status 201
Headers {"server":"Cowboy","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","content-type":"application/json; charset=utf-8","content-length":"78","etag":"W/\"4e-ZxC702mgB6lts1cpp/xCuQ\"","date":"Thu, 11 Feb 2016 22:29:16 GMT","via":"1.1 vegur"}
Dados finalizados {"__v":0,"name":"Augusto Ody","type":"aluno","_id":"56bd0b3b2c257311009b5721"}
```

# Modificação (PUT)
```sh
postData name=augustoody
postData.length 15
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-frcmbtrtM2TSD81obiZtjw\"","date":"Thu, 11 Feb 2016 22:30:47 GMT","via":"1.1 vegur"}
Dados finalizados {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6250164601028083713","electionId":"565e25d106dca622271891c4"}}
```

## **Depois faça o DELETE**, criando o script para tal, colocando aqui a resposta.
```sh
Status 204
Headers {"server":"Cowboy","content-length":"0","connection":"close","x-powered-by":"Express","access-control-allow-origin":"*","date":"Thu, 11 Feb 2016 22:34:41 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**.
Consulta na API do Star Wars
```js
'use strict';

const http = require('http');

http.get({
        host: 'swapi.co'
    ,   path: '/api/people/'
    ,   port: 80
    ,   agent: false
}, (res) => {

    let body = '';

    console.log('statusCode', res.statusCode);
    console.log('Headers', JSON.stringify(res.headers));

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

    res.on('end', () => {
        body = JSON.parse(body);
        console.log('<html><body>');
        console.log('<h1>Be - Mean</h1>');
        console.log('<h2>Query String</h2>');
        console.log('<ul>');
        body.results.forEach((data) => {
            console.log("<li>"+data.name+"</li>");
        });
        console.log('</ul>');
        console.log('</body><html>');
    });

    res.on('error', (e) => {
        console.log('error', e.message);
    });

});
```

Resultado:
```
statusCode 200
Headers {"date":"Thu, 11 Feb 2016 23:19:17 GMT","content-type":"application/json","transfer-encoding":"chunked","connection":"close","set-cookie":["__cfduid=dbecc884cb514f3f89b22f6320b74455d1455232756; expires=Fri, 10-Feb-17 23:19:16 GMT; path=/; domain=.swapi.co; HttpOnly"],"etag":"\"1aa90088e8812cbe8a55f2990a9e0e15\"","vary":"Accept, Cookie","x-frame-options":"SAMEORIGIN","allow":"GET, HEAD, OPTIONS","via":"1.1 vegur","server":"cloudflare-nginx","cf-ray":"2733c71872aa1623-LIM"}
<html><body>
<h1>Be - Mean</h1>
<h2>Query String</h2>
<ul>
<li>Luke Skywalker</li>
<li>C-3PO</li>
<li>R2-D2</li>
<li>Darth Vader</li>
<li>Leia Organa</li>
<li>Owen Lars</li>
<li>Beru Whitesun lars</li>
<li>R5-D4</li>
<li>Biggs Darklighter</li>
<li>Obi-Wan Kenobi</li>
</ul>
</body><html>
```


text:
# Node.js - Aula 03 - Exercício
**user:** [felipelopesrita](https://github.com/felipelopesrita)
**autor:** Felipe José Lopes Rita

## 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 original, o navergador gera uma segunda requisição em que procura o favicon.ico do site

## Qual a DIFERENÇA entre o GET e o POST?
No verbo GET, a query string é anexada diretamente à URL da requisição. Assim, as informações a serem enviadas só podem ser strings, além de possuir um limite de tamanho máximo da mensagem a ser enviada. Este verbo também guarda as informações enviadas em cache.
De forma contrária, o verbo POST anexa as informações no corpo do documento da requisição, possibilitando que sejam enviados outros tipos de dados além de strings e também que não exista um limite de tamanho para a requisição. Outro ponto importante é que esse método não guarda as informações enviadas em cache.

## Crie um Pokemon na nossa API com seu nome, depois modifique seu nome pelo seu User do Github.
**Cria com meu nome**
```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-2gzvZ0bdq2GrzbiKW4KACA\"","date":"Wed, 24 Feb 2016 03:46:24 GMT","via":"1.1 vegur"}
Dados finalizados:  {"__v":0,"name":"Felipe J. L. Rita","type":"aluno","_id":"56cd279073a6431100ba1de8"}
```
**Modifica pelo usuario do GitHub**
```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-c3SDbmIqBjmtNxn+Zvbfyw\"","date":"Wed, 24 Feb 2016 03:49:37 GMT","via":"1.1 vegur"}
Dados finalizados:  {"data":{"ok":1,"nModified":1,"n":1,"lastOp":"6254699785844948993","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, 24 Feb 2016 03:53: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**.
```js
STATUS: 200
HEADERS: {"server":"nginx/1.1.19","date":"Wed, 24 Feb 2016 04:42:21 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:
...
<ul>
<li>Water</li>
<li>Grass</li>
<li>Electric</li>
<li>Ice</li>
<li>Dragon</li>
</ul>
...
```


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

**autor:** Higor Diego Alves Ferreira Pinheiro

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

Uma para puxar o que foi feito na requisição e a segunda para o pegar o (favicon) *.icon

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

No get, as informações são enviadas como string com anexo na url, no post a informação é encapsuladas junto ao corpo da requisição não vista na url.

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

```js

'use strict'
const http = require('http')
,	  querystring = require('querystring')
,	  postData = querystring.stringify({
		name: 'Higor Diego'
	,	type: 'Aluno'
});
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){
	let data = ''
	res.setEncoding('utf8');
	res.on('data', (chunk)=>{
		data += chunk;
	});
	res.on('end',()=>{
		console.log('Dados Cadastrados:',data);
	});
}
const req = http.request(options, callback);
req.write(postData)
req.end();

```
---

```js

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

	}
};

function callback(res){
	let data = ''
	res.setEncoding('utf8');
	res.on('data', (chunk)=>{
		data += chunk;
	});
	res.on('end',()=>{
		console.log('Dados Alterados:',data);
	});
}
const req = http.request(options, callback);
req.write(postData)
req.end();

```

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

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

	}
};

function callback(res){
	let data = ''
	res.setEncoding('utf8');
	res.on('data', (chunk)=>{
		data += chunk;
	});
	res.on('end',()=>{
		console.log('Dados Alterados:',data);
	});
}
const req = http.request(options, callback);
req.write(postData)
req.end();

```

## Escolha uma **API externa** e crie um script para fazer um GET nela **mostrando o resultado com HTML**.
```html
<body>
	<h1>CEP</h1>
	<ul>
		<li>Santana</li>
		<li>Rua Voluntários da Pátria</li>
		<li>02011200</li>
		<li>SP</li>
	</ul>
</body>
</html>
```


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

**autor:** Marcos Antonio Martinez Florentin

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

O Chrome, além da requisição que foi solicitada executa outro GET para buscar o favicon.icon e como não encontra retorna vazio.

## Qual a DIFERENÇA entre o GET e o POST?
- **GET** é o metodo de leitura, para obter dados passados na querystring.
- **POST** é o  metodo de inserção, cria um objeto.

## 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: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-u5Z+ipnVIkEOCLIKIHGoPA\"","date":"Wed, 13 Jul 2016 14:22:59 GMT","via":"1.1 vegur"}
Datos finalizados {"__v":0,"name":"Marcos Martinez","type":"Alumno","_id":"57864ec3d2fdf3110011f462"}

```

## **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, 13 Jul 2016 17:26: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**.

```js

'use strict';

const http = require('http'); //libreria que se encarga de la requisiciones
const options = {
  host: 'webschool-io.herokuapp.com',
  path: '/api/pokemons',
  method: 'GET',
  headers: {
      'User-Agent': 'Chrome',
      'Content-Type': 'text/html'
  }

};

const req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('<html><body><h4> ' +chunk+'</code></body></html>');
  });
});

req.on('error', function(e) {
  console.log('Error: ' + e.message);
});

req.end();

```