wbruno / livro-nodejs

Livro de NodeJS
https://novatec.com.br/livros/nodejs-4ed/
MIT License
107 stars 33 forks source link

Capítulo 3 - Testando a requisição com curl #2

Closed Cmcampos86 closed 3 years ago

Cmcampos86 commented 8 years ago

Boa tarde William!

Estou no capítulo 3 do seu livro e estou com dificuldade de executar os comandos referente a parte 3.5 Testando a requisição com curl.

Poderia me passar um exemplo um pouco mais detalhado de como funciona?

wbruno commented 8 years ago

oi @Cmcampos86 qual o seu sistema operacional? O comando curl realiza chamadas http e para isso aceita alguns argumentos.

Ex: Para fazer um GET na Home do google:

$ curl http://www.google.com.br
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" ....

você verá que o resultado será o HTML dessa página. Se você quiser ver apenas os cabeçalhos:

$ curl --head http://www.google.com.br
HTTP/1.1 200 OK
Date: Fri, 19 Aug 2016 20:00:05 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: NID=84=TpwVRxVRKPCqh3K2c5ielTIIPmzxDnxvvk7yqvJ87WZomOu1HyH3REX2jcB9YMXUowBM7_15m5bHlGR7vLdmTaM0_a1dVdfutGyJi6owCkZDXeBRVAw2PLwUI61Fb2nu; expires=Sat, 18-Feb-2017 20:00:05 GMT; path=/; domain=.google.com.br; HttpOnly
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding

Podemos também informar cabeçalhos na requisição com -H e informar qual método HTTP vamos usar com -X, lembrando que para enviar dados usamos -d. Então para fazer um POST, enviando o cabeçalho informando que vamos enviar um JSON, usamos o seguinte:

curl -X POST http://localhost:3000 -H 'Content-Type: application/json' -d '{"password":1138}'

Então: -X POST informa que vamos enviar um HTTP com o método POST -H 'Content-Type: application/json' informa que a requisição é do tipo json -d '{"password":1138}' envia data (corpo da requisição) como JSON http://localhost:3000 é a URL que queremos chamar

Cmcampos86 commented 8 years ago

Estou usando o Windows 7.

Criei um servidor HTTP, por exemplo o localhost:3000. Minha dúvida é... ao digitar o comando

curl -X POST http://localhost:3000 -H 'Content-Type: application/json' -d '{"password":1138}'

no terminal, como a informação do JSON {"password":1138}' vai ser mostrada? Terei que fazer algum Jquery pra obter isso?

wbruno commented 8 years ago

a informação do JSON vai chegar lá na sua rota do Express:

app.post('/', function(request, response, next) {
    console.log('body', request.body); // vai chegar aqui o  {"password":1138}
    console.log(request.body.password); // 1138

   response.send('OK!!');
});

com jQuery seria assim:

jQuery
  .post('/', { password: 1138 })
  .then(function(data) { 
      console.log(data) 
  });

ali no console.log(data) do jQuery, você vai receber o OK!! que o Express respondeu.

Cmcampos86 commented 8 years ago

Haaaaaa legal!

Agora entendi!

Muito obrigado pelo exemplo!

Cmcampos86 commented 8 years ago

wbruno bom dia!

Fiz um teste ontem referente ao exemplo. A linha "console.log('body', request.body);" me retornou certinho o contéudo json (body { '\'{password:1138}\'': '' }), mas a linha console.log(request.body.password); me retornou undefined.

Usei o código abaixo para fazer o servidor HTTP:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

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

app.post('/', function(request, response, next) {
    console.log('body', request.body); // vai chegar aqui o  {"password":1138}
    console.log(request.body.password); // 1138

   response.send('OK!!');
});

app.listen(3000);
console.log('Server running at http://127.0.0.1.:3000/');

E aqui utilizei o curl:

curl -X POST http://localhost:3000 -H 'Content-Type: application/json' -d '{"password":1138}'

Não obtive nenhum erro, a questão foi que o request.body.password retornou undefined.

Será necessário fazer alguma outra coisa para obter o valor de password?

wbruno commented 8 years ago

mudaram algumas coisas no bodyParser, troca:

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

por:

app.use(bodyParser());
Cmcampos86 commented 8 years ago

Eu troquei pelo app.use(bodyParser()); e apareceu a mensagem abaixo:

body-parser deprecated bodyParser: use individual json/urlencoded middlewares body-parser deprecated undefined extended: provide extended option node-modules\body-parser\index.js

Isso não impediu de executar, mas continua como undefined a linha "console.log(request.body.password);" e a linha "console.log(request.body);" continua com o conteúdo json (body { '\'{password:1138}\'': '' })

Cmcampos86 commented 8 years ago

Resolvi!

O problema estava na forma que o cabeçalho estava sendo passado no curl. Debugando eu vi que o cabeçalho no Nodejs não estava como Json sendo que eu tinha passado no curl

No comando cURL eu acrescentei um -i antes do -H:

curl -X POST http://localhost:3000 -i -H 'Content-Type: application/json' -d '{"password":1138}'

Ai o resultado apareceu certinho no console.log(request.body); e no console.log(request.body.password);

Obrigado pela ajuda!