Category: Javascript


NodeJS :: Métodos e Pedidos … Uma era R.E.S.T. ?


Olá pessoal, eis mais um post sobre ... NodeJS!


Hoje iremos, dentro do tema do último post, abranger ainda melhor o objecto request...


Antes demais, queria deixar bem claro que estes dois últimos posts (o anterior e este que estou a iniciar) foram/são posts que foram dedicados ao objecto Request, visto que é bastante importante entender o comportamento do objecto, como podemos obter informação sobre os pedidos, etc...
... no entanto, haverá uma fase posterior onde iremos começar a aprender a trabalhar com uma framework (ExpressJS) onde iremos ter muito deste trabalho facilitado :)


Mas depois verão! :D




Adiante... Hoje iremos ver a propriedade method do objecto Request. Iremos lidar com pedidos feitos por métodos diferentes (POST e GET).




Ponto de Situação do trabalho já realizado:
01 - No tem permisso para visualizar links. Registar ou Login
02 - No tem permisso para visualizar links. Registar ou Login
03 - No tem permisso para visualizar links. Registar ou Login




Objectivo final do post:
Com base em parte do código do tópico anterior (03), iremos fazer com que o WebServer saiba agir quando o pedido é feito por diversos métodos :).




Realização:
Primeiro, vamos criar o directório para guardarmos o trabalho.
Tendo em conta a estrutura de directórios criadas no tópico anterior, hoje recomendo criarem o seguinte directório:






Código: No tem permisso para visualizar links. Registar ou Login
mkdir ~/nodeprojects/portugalCode/03-dealingWithMethods/
cd ~/nodeprojects/portugalCode/03-dealingWithMethods/


A nossa pasta do projecto já está criada, então vamos começar a programar. No entanto, como nos vamos basear no código anterior, o melhor será copiar o ficheiro para este directório recém-criado. Na consola isso é feito através dos seguintes comandos:




Código: No tem permisso para visualizar links. Registar ou Login
cp ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.js ~/nodeprojects/portugalCode/03-dealingWithMethods/dealingWithMethods.js
Este comando o que faz é copiar (cp) o ficheiro criado no tópico anterior para a pasta recém-criada renomeando-o para dealingWithMethods.js


Eis o estado inicial do ficheiro:
Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');
http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + decodeURI(params[1]));
  }
  response.end();
})
.listen(4000);




Ora bem, desta vez, não quero hello worlds... Já chega dessas coisas porque já estamos um passo à frente... Agora, vamos retornar HTML simples :) E para testar métodos, nada melhor do que um formulário, certo?
Primeiro vamos "limpar" a função de processamento do pedido....

Onde temos:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + decodeURI(params[1]));
  }
  response.end();
})


Passa a:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  response.end();
})




Pronto.... O cabeçalho a afirmar que o conteúdo é HTML está lá e o término da resposta, também...




Agora vamos programar a resposta de um formulário com um simples botão, só para fazer post :)
Assim, alteramos para:



Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})


Simples hum? ;-). Ora se colocarmos o servidor a correr e fizermos um pedido, temos um form com um botão de retorno.


Agora, para detectarmos qual o método a ser usado, temos o request.method. O método poderá ser um dos 4 tipos suportados pelo HTTP 1.1:
- GET
- POST
- PUT
- DELETE


No entanto, como os browsers convencionais não aplicam o protocolo HTTP 1.1, apenas o POST e GET são usados pelos mesmos...


Vamos então apresentar uma mensagem caso o pedido seja feito por método POST :

Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  if( request.method == 'POST' )
    response.write('<p>Foi feito por POST!</p>');


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})


Gravamos, executamos o servidor... fazemos o pedido e aparece o formulário com o botão, tal como antes... isto porque fizemos o pedido da página por GET... ora vamos então fazer um POST, usando o botão ...


... aí está a mensagem, certo? Certoooo....


Resumindamente, eis aqui o ficheiro completo:
Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');


http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  if( request.method == 'POST' )
    response.write('<p>Foi feito por POST!</p>');


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})
.listen(4000);




Bastante simples hum? Sem apaches, htaccess, nem nada do género... puro e simples javascript e NodeJS :)


Dou por concluído este post, prometendo amanhã mostrar como 'parsamos' os dados enviados por POST... Vai envolver JSON, para além de um outro módulo que não o 'http' ;-).


Abraço e até amanhã :)

NodeJS :: Métodos e Pedidos … Uma era R.E.S.T. ?


Olá pessoal, eis mais um post sobre ... NodeJS!


Hoje iremos, dentro do tema do último post, abranger ainda melhor o objecto request...


Antes demais, queria deixar bem claro que estes dois últimos posts (o anterior e este que estou a iniciar) foram/são posts que foram dedicados ao objecto Request, visto que é bastante importante entender o comportamento do objecto, como podemos obter informação sobre os pedidos, etc...
... no entanto, haverá uma fase posterior onde iremos começar a aprender a trabalhar com uma framework (ExpressJS) onde iremos ter muito deste trabalho facilitado :)


Mas depois verão! :D




Adiante... Hoje iremos ver a propriedade method do objecto Request. Iremos lidar com pedidos feitos por métodos diferentes (POST e GET).




Ponto de Situação do trabalho já realizado:
01 - No tem permisso para visualizar links. Registar ou Login
02 - No tem permisso para visualizar links. Registar ou Login
03 - No tem permisso para visualizar links. Registar ou Login




Objectivo final do post:
Com base em parte do código do tópico anterior (03), iremos fazer com que o WebServer saiba agir quando o pedido é feito por diversos métodos :).




Realização:
Primeiro, vamos criar o directório para guardarmos o trabalho.
Tendo em conta a estrutura de directórios criadas no tópico anterior, hoje recomendo criarem o seguinte directório:






Código: No tem permisso para visualizar links. Registar ou Login
mkdir ~/nodeprojects/portugalCode/03-dealingWithMethods/
cd ~/nodeprojects/portugalCode/03-dealingWithMethods/


A nossa pasta do projecto já está criada, então vamos começar a programar. No entanto, como nos vamos basear no código anterior, o melhor será copiar o ficheiro para este directório recém-criado. Na consola isso é feito através dos seguintes comandos:




Código: No tem permisso para visualizar links. Registar ou Login
cp ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.js ~/nodeprojects/portugalCode/03-dealingWithMethods/dealingWithMethods.js
Este comando o que faz é copiar (cp) o ficheiro criado no tópico anterior para a pasta recém-criada renomeando-o para dealingWithMethods.js


Eis o estado inicial do ficheiro:
Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');
http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + decodeURI(params[1]));
  }
  response.end();
})
.listen(4000);




Ora bem, desta vez, não quero hello worlds... Já chega dessas coisas porque já estamos um passo à frente... Agora, vamos retornar HTML simples :) E para testar métodos, nada melhor do que um formulário, certo?
Primeiro vamos "limpar" a função de processamento do pedido....

Onde temos:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + decodeURI(params[1]));
  }
  response.end();
})


Passa a:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});
  response.end();
})




Pronto.... O cabeçalho a afirmar que o conteúdo é HTML está lá e o término da resposta, também...




Agora vamos programar a resposta de um formulário com um simples botão, só para fazer post :)
Assim, alteramos para:



Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})


Simples hum? ;-). Ora se colocarmos o servidor a correr e fizermos um pedido, temos um form com um botão de retorno.


Agora, para detectarmos qual o método a ser usado, temos o request.method. O método poderá ser um dos 4 tipos suportados pelo HTTP 1.1:
- GET
- POST
- PUT
- DELETE


No entanto, como os browsers convencionais não aplicam o protocolo HTTP 1.1, apenas o POST e GET são usados pelos mesmos...


Vamos então apresentar uma mensagem caso o pedido seja feito por método POST :

Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  if( request.method == 'POST' )
    response.write('<p>Foi feito por POST!</p>');


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})


Gravamos, executamos o servidor... fazemos o pedido e aparece o formulário com o botão, tal como antes... isto porque fizemos o pedido da página por GET... ora vamos então fazer um POST, usando o botão ...


... aí está a mensagem, certo? Certoooo....


Resumindamente, eis aqui o ficheiro completo:
Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');


http.createServer(function(request,response){
  response.writeHead(200,{'Content-Type':'text/html; charset=utf-8'});


  if( request.method == 'POST' )
    response.write('<p>Foi feito por POST!</p>');


  response.write('<form method="post" action=""><input type="submit" value="Fazer POST" /></form>');


  response.end();
})
.listen(4000);




Bastante simples hum? Sem apaches, htaccess, nem nada do género... puro e simples javascript e NodeJS :)


Dou por concluído este post, prometendo amanhã mostrar como 'parsamos' os dados enviados por POST... Vai envolver JSON, para além de um outro módulo que não o 'http' ;-).


Abraço e até amanhã :)

NodeJS :: Gerir tipos de pedidos

Cá estamos para outro post sobre NodeJS...


Hoje iremos investigar um bocadinho melhor o objecto request para manipular o url e os métodos usados nos pedidos.


Ponto de Situação do trabalho já realizado:
01 - No tem permisso para visualizar links. Registar ou Login
02 - No tem permisso para visualizar links. Registar ou Login




Objectivo final do post:
Com base no código do tópico anterior (02), iremos fazer com que o WebServer saiba responder a diferentes endereços pedidos.




Realização:
Primeiro, vamos criar o directório para guardarmos o trabalho.
Tendo em conta a estrutura de directórios criadas no tópico anterior, hoje recomendo criarem o seguinte directório:



Código: No tem permisso para visualizar links. Registar ou Login
mkdir ~/nodeprojects/portugalCode/02-managingRequests/
cd ~/nodeprojects/portugalCode/02-managingRequests/


Agora que já temos a nossa pasta do projecto criada, vamos então começar a programar. No entanto, como nos vamos basear no código anterior, o melhor será copiar o ficheiro para este directório recém-criado. Na consola isso é feito através dos seguintes comandos:


Código: No tem permisso para visualizar links. Registar ou Login
cp ~/nodeprojects/portugalCode/helloWorld/helloWorld.js ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.js
Este comando o que faz é copiar (cp) o ficheiro criado no tópico anterior para a pasta recém-criada renomeando-o para managingRequests.js




De seguida, vamos abrir o ficheiro no nosso editor preferido. Neste caso o meu, para a consola, é o vim. Já vos demonstrei no tópico anterior como abrir o ficheiro no editor vim, daqui para a frente não o farei... Vou no entanto mostrar o estado inicial do ficheiro:


Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');




http.createServer(function(request,response){




  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();




})
.listen(4000);




Ora bem, sempre que efectuamos o pedido ao servidor ele dá-se ao luxo de responder sempre Hello World. Ao fim de algum tempo, isso perde a piada :P (tipo ao 2º pedido :D). O ideal era, por exemplo pôr as seguintes regras:
1 - Se o pedido for feito para a raiz do servidor ( ou seja o endereço No tem permisso para visualizar links. Registar ou Login ou No tem permisso para visualizar links. Registar ou Login ) ele retorna Hello!


2 - Se o pedido for feito da seguinte maneira ( No tem permisso para visualizar links. Registar ou Login ou No tem permisso para visualizar links. Registar ou Login ) responde com o nome: Hello Ricardo!




Vamos então alterar o código... Para que os acentos funcionem correctamente, bem como outros caracteres especiais, sugiro que gravem o vosso ficheiro codificado em utf-8 (sem BOM).


Primeiramente temos que dizer para o webserver responder em utf-8. Como tal, a linha:

Código: No tem permisso para visualizar links. Registar ou Login
'Content-Type' : 'text/html'

Altera para:
Código: No tem permisso para visualizar links. Registar ou Login
'Content-Type' : 'text/html; charset=utf-8'



O objecto request tem uma propriedade chamada url. Essa propriedade tem o endereço pedido desde a raiz para a frente. Um pedido feito para a raiz do servidor terá como valor na url de /.




Aproveito aqui para dar a conhecer uma função, que será bastante útil para fazer debug da vossa aplicação, a console.log(). Esta função permite enviar para a consola do servidor conteúdo, seja uma string, array ou objecto, para se poder ter uma noção do que se está a manipular.
Neste caso vamos utilizar a console.log() para ver os diferentes endereços para depois vermos com o que estamos a trabalhar.
Dessa forma, vamos alterar o código... Inicialmente a função dos pedidos do servidor está:


Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){




  response.writeHead(200,{
    'Content-Type' : 'text/html; charset=utf-8'
  });
  response.write('Hello World');
  response.end();




})




Agora, vamos acrescentar um console.log(request.url) antes do response.writeHead() para vermos o pedido como aparece originalmente. Estejam à vontade para passar os mais variados pedidos, ex: No tem permisso para visualizar links. Registar ou Login<input type="text" />


Isso fará com que possam visualizar o que é pedido :) E vão reparar que o retorno é sempre o mesmo "Hello World" :)


Dessa forma, o código fica:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){


  console.log(request.url);
  response.writeHead(200,{
    'Content-Type' : 'text/html; charset=utf-8'
  });
  response.write('Hello World');
  response.end();




})


Após a alteração, gravam e correm o comando:


Código: No tem permisso para visualizar links. Registar ou Login
node ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.jsO servidor ficará a correr e poderão fazer pedidos ao servidor... sempre que quiserem parar o servidor fazem CTRL+C e o processo termina ;-). Sempre que fazem alterações ao ficheiro da aplicação, devem reiniciar o servidor para ele carregar as alterações.


Sempre que fizerem um pedido ao servidor vão ver o servidor a logar os diferentes pedidos. No caso do Google Chrome vão ver que ele faz sempre um pedido-extra, o favicon.ico... :)


Pronto, temos então o endereço a vir através do request.url... Ora então segundo a primeira regra, se for para a raiz do servidor, retornamos Hello World :)


Vamos então alterar o código para ele só responder Hello World se for um endereço = "/". Podemos deixar na mesma o log para vermos os pedidos enquanto os fazemos. Onde temos:


Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello World');


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }


Pronto, agora paramos o servidor, voltamos a correr e testamos. Façam testes tanto com pedidos para a raiz do servidor como com parâmetros extra:
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login


Verão que só o primeiro destes testes é que responde com Hello World :)


... Ok, a primeira regra está a obedecer bem... Falta a 2ª! Mas para isso temos que manipular o url certo? Não vamos dizer "Hello World /Ricardo" ... ou em casos que tenha mais do que um parâmetro: "Hello World /Ricardo/dgfasgfdg" ... Só queremos o nome, vamos assumir que o nome é o 1º parâmetro (Ricardo)! Mas para isso vamos ter que dividir o endereço pelas /'s :) E assim é fácil obter o nome :).


Alteramos então o código... Onde temos:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  response.end();


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + params[0]);
  }
Ora bem, o processo é simples. Dividimos a string do endereço por /'s e ficamos com um array na variável params. Depois, faço o log por motivos de debug e envio para o browser o Hello concatenado com a primeira casa do array que terá o nome.
Gravamos, de seguida reiniciamos o servidor. Fazemos o pedido de teste, por exemplo: No tem permisso para visualizar links. Registar ou Loginé/ ...


... Eh lá... Mas não está a mostrar o nome :|!!! Pois não, isso deve-se à lógica... Mas vamos ver o que diz o log:
Código: No tem permisso para visualizar links. Registar ou Login


[ '', 'jos%C3%A9', '' ]
[ '', 'favicon.ico' ] <-- Este não nos interessa :)


Ora pois... quando fazemos o split() pelas barras a primeira barra (da raiz do servidor) dá origem a uma primeira casa vazia... A correcção é simples... de 0 passamos para a casa 1... :)


Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  response.end();


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + params[1]);
  }
Bem... agora estará melhor :).... Gravamos, reiniciamos o servidor e ... Bem, está melhor porque aparece algo, mas aqui não é José pois não? É "Jos%C3%A9" ... Temos que fazer o decode do endereço. Para quem não sabe existem duas funções em Javascript chamadas decodeURI() e encodeURI() que fazem a descodificação e codificação - respectivamente - de uma string para ser recebida ou passada por endereço web.


Neste caso alteramos o código na linha:
Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello ' + params[1]);

Para:
Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello ' + decodeURI(params[1]));Gravamos, reiniciamos o servidor, testamos e... voilá! José! Hello José.... :) Podem testar com múltiplos parâmetros para ver se seleccionamos o certo :)






Neste tópico aprendemos que o objecto request tem uma propriedade url que podemos usar para saber qual o endereço pedido ao servidor, de modo a podermos servir o browser consoante aquilo que pedimos.
Aprendemos também a debugar através da consola através do console.log(), embora existam outras maneiras (melhores) de debugar...




No próximo tópico iremos aprender a manipular métodos (GET, POST) e a responder a pedidos dependendo do tipo de método e endereço (usando o que aprendemos aqui também).




Um abraço até à próxima!

NodeJS :: Gerir tipos de pedidos

Cá estamos para outro post sobre NodeJS...


Hoje iremos investigar um bocadinho melhor o objecto request para manipular o url e os métodos usados nos pedidos.


Ponto de Situação do trabalho já realizado:
01 - No tem permisso para visualizar links. Registar ou Login
02 - No tem permisso para visualizar links. Registar ou Login




Objectivo final do post:
Com base no código do tópico anterior (02), iremos fazer com que o WebServer saiba responder a diferentes endereços pedidos.




Realização:
Primeiro, vamos criar o directório para guardarmos o trabalho.
Tendo em conta a estrutura de directórios criadas no tópico anterior, hoje recomendo criarem o seguinte directório:



Código: No tem permisso para visualizar links. Registar ou Login
mkdir ~/nodeprojects/portugalCode/02-managingRequests/
cd ~/nodeprojects/portugalCode/02-managingRequests/


Agora que já temos a nossa pasta do projecto criada, vamos então começar a programar. No entanto, como nos vamos basear no código anterior, o melhor será copiar o ficheiro para este directório recém-criado. Na consola isso é feito através dos seguintes comandos:


Código: No tem permisso para visualizar links. Registar ou Login
cp ~/nodeprojects/portugalCode/helloWorld/helloWorld.js ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.js
Este comando o que faz é copiar (cp) o ficheiro criado no tópico anterior para a pasta recém-criada renomeando-o para managingRequests.js




De seguida, vamos abrir o ficheiro no nosso editor preferido. Neste caso o meu, para a consola, é o vim. Já vos demonstrei no tópico anterior como abrir o ficheiro no editor vim, daqui para a frente não o farei... Vou no entanto mostrar o estado inicial do ficheiro:


Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');




http.createServer(function(request,response){




  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();




})
.listen(4000);




Ora bem, sempre que efectuamos o pedido ao servidor ele dá-se ao luxo de responder sempre Hello World. Ao fim de algum tempo, isso perde a piada :P (tipo ao 2º pedido :D). O ideal era, por exemplo pôr as seguintes regras:
1 - Se o pedido for feito para a raiz do servidor ( ou seja o endereço No tem permisso para visualizar links. Registar ou Login ou No tem permisso para visualizar links. Registar ou Login ) ele retorna Hello!


2 - Se o pedido for feito da seguinte maneira ( No tem permisso para visualizar links. Registar ou Login ou No tem permisso para visualizar links. Registar ou Login ) responde com o nome: Hello Ricardo!




Vamos então alterar o código... Para que os acentos funcionem correctamente, bem como outros caracteres especiais, sugiro que gravem o vosso ficheiro codificado em utf-8 (sem BOM).


Primeiramente temos que dizer para o webserver responder em utf-8. Como tal, a linha:

Código: No tem permisso para visualizar links. Registar ou Login
'Content-Type' : 'text/html'

Altera para:
Código: No tem permisso para visualizar links. Registar ou Login
'Content-Type' : 'text/html; charset=utf-8'



O objecto request tem uma propriedade chamada url. Essa propriedade tem o endereço pedido desde a raiz para a frente. Um pedido feito para a raiz do servidor terá como valor na url de /.




Aproveito aqui para dar a conhecer uma função, que será bastante útil para fazer debug da vossa aplicação, a console.log(). Esta função permite enviar para a consola do servidor conteúdo, seja uma string, array ou objecto, para se poder ter uma noção do que se está a manipular.
Neste caso vamos utilizar a console.log() para ver os diferentes endereços para depois vermos com o que estamos a trabalhar.
Dessa forma, vamos alterar o código... Inicialmente a função dos pedidos do servidor está:


Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){




  response.writeHead(200,{
    'Content-Type' : 'text/html; charset=utf-8'
  });
  response.write('Hello World');
  response.end();




})




Agora, vamos acrescentar um console.log(request.url) antes do response.writeHead() para vermos o pedido como aparece originalmente. Estejam à vontade para passar os mais variados pedidos, ex: No tem permisso para visualizar links. Registar ou Login<input type="text" />


Isso fará com que possam visualizar o que é pedido :) E vão reparar que o retorno é sempre o mesmo "Hello World" :)


Dessa forma, o código fica:
Código: No tem permisso para visualizar links. Registar ou Login

http.createServer(function(request,response){


  console.log(request.url);
  response.writeHead(200,{
    'Content-Type' : 'text/html; charset=utf-8'
  });
  response.write('Hello World');
  response.end();




})


Após a alteração, gravam e correm o comando:


Código: No tem permisso para visualizar links. Registar ou Login
node ~/nodeprojects/portugalCode/02-managingRequests/managingRequests.jsO servidor ficará a correr e poderão fazer pedidos ao servidor... sempre que quiserem parar o servidor fazem CTRL+C e o processo termina ;-). Sempre que fazem alterações ao ficheiro da aplicação, devem reiniciar o servidor para ele carregar as alterações.


Sempre que fizerem um pedido ao servidor vão ver o servidor a logar os diferentes pedidos. No caso do Google Chrome vão ver que ele faz sempre um pedido-extra, o favicon.ico... :)


Pronto, temos então o endereço a vir através do request.url... Ora então segundo a primeira regra, se for para a raiz do servidor, retornamos Hello World :)


Vamos então alterar o código para ele só responder Hello World se for um endereço = "/". Podemos deixar na mesma o log para vermos os pedidos enquanto os fazemos. Onde temos:


Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello World');


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }


Pronto, agora paramos o servidor, voltamos a correr e testamos. Façam testes tanto com pedidos para a raiz do servidor como com parâmetros extra:
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login
- No tem permisso para visualizar links. Registar ou Login


Verão que só o primeiro destes testes é que responde com Hello World :)


... Ok, a primeira regra está a obedecer bem... Falta a 2ª! Mas para isso temos que manipular o url certo? Não vamos dizer "Hello World /Ricardo" ... ou em casos que tenha mais do que um parâmetro: "Hello World /Ricardo/dgfasgfdg" ... Só queremos o nome, vamos assumir que o nome é o 1º parâmetro (Ricardo)! Mas para isso vamos ter que dividir o endereço pelas /'s :) E assim é fácil obter o nome :).


Alteramos então o código... Onde temos:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  response.end();


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + params[0]);
  }
Ora bem, o processo é simples. Dividimos a string do endereço por /'s e ficamos com um array na variável params. Depois, faço o log por motivos de debug e envio para o browser o Hello concatenado com a primeira casa do array que terá o nome.
Gravamos, de seguida reiniciamos o servidor. Fazemos o pedido de teste, por exemplo: No tem permisso para visualizar links. Registar ou Loginé/ ...


... Eh lá... Mas não está a mostrar o nome :|!!! Pois não, isso deve-se à lógica... Mas vamos ver o que diz o log:
Código: No tem permisso para visualizar links. Registar ou Login


[ '', 'jos%C3%A9', '' ]
[ '', 'favicon.ico' ] <-- Este não nos interessa :)


Ora pois... quando fazemos o split() pelas barras a primeira barra (da raiz do servidor) dá origem a uma primeira casa vazia... A correcção é simples... de 0 passamos para a casa 1... :)


Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  response.end();


Alteramos para:

Código: No tem permisso para visualizar links. Registar ou Login

  if( request.url == '/' )
  {
    response.write('Hello World');
  }
  else
  {
    var params = request.url.split('/');
    console.log(params);
    response.write('Hello ' + params[1]);
  }
Bem... agora estará melhor :).... Gravamos, reiniciamos o servidor e ... Bem, está melhor porque aparece algo, mas aqui não é José pois não? É "Jos%C3%A9" ... Temos que fazer o decode do endereço. Para quem não sabe existem duas funções em Javascript chamadas decodeURI() e encodeURI() que fazem a descodificação e codificação - respectivamente - de uma string para ser recebida ou passada por endereço web.


Neste caso alteramos o código na linha:
Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello ' + params[1]);

Para:
Código: No tem permisso para visualizar links. Registar ou Login
response.write('Hello ' + decodeURI(params[1]));Gravamos, reiniciamos o servidor, testamos e... voilá! José! Hello José.... :) Podem testar com múltiplos parâmetros para ver se seleccionamos o certo :)






Neste tópico aprendemos que o objecto request tem uma propriedade url que podemos usar para saber qual o endereço pedido ao servidor, de modo a podermos servir o browser consoante aquilo que pedimos.
Aprendemos também a debugar através da consola através do console.log(), embora existam outras maneiras (melhores) de debugar...




No próximo tópico iremos aprender a manipular métodos (GET, POST) e a responder a pedidos dependendo do tipo de método e endereço (usando o que aprendemos aqui também).




Um abraço até à próxima!

Re: NodeJS :: The ‘Hello World’

Ficarei à espera de feedback então :)

Até lá, abraço ;) :) Vou preparar o próximo post

Re: NodeJS :: The ‘Hello World’

vou experimentar de certeza :)

agora tou um bocado sem tempo para novas aventuras! ;)

gde abraço

Re: NodeJS :: The ‘Hello World’

:) Mas quê andas a experimentar ou ... é fixe e tal mas nada disso? :P Olha que isto é muito fixe para trabalhar com WebSockets :|


Num dos posts mais avançados vou fazer algo com WebSockets, uma espécie de controlo remoto - coisa que já fiz -  mas a ideia é passar info :)


"Agraço" para ti tb :)

Re: NodeJS :: The ‘Hello World’

mais um de 5 estrelas :)

agraço

NodeJS :: The ‘Hello World’

Ora então bem vindos a mais um post sobre NodeJS...


Neste post irei dar início a uma série de posts onde se fará código Javascript para NodeJS.
Tentarei ao máximo explicar o código, num processo quase linha-a-linha. No entanto, devem também estar atentos aos comentários no próprio código que poderão dar indicações-extra.


Antes de começar, começo pelos requisitos deste post:


  • São necessários conhecimentos intermédios de Javascript - Não é preciso ser-se um expert, mas convém saber o que são objectos em Javascript, como criar objectos e/ou arrays, manipulá-los, etc. Aquilo que um programador avançado consideraria "o básico" :)
  • Conhecimentos básicos de Redes - Não é preciso saber configurar redes, servidores, ou outras coisas. No entanto, noções de portas de rede, IP's entre outras coisas, serão necessárias para a total compreensão do post.


Ponto de Situação do trabalho já realizado:
No tem permisso para visualizar links. Registar ou Login


Objectivo final do post:
Ter um WebServer feito por nós a retornar a mensagem Hello World, feito em NodeJS


Realização:
Primeiro, vamos criar uma estrutura de directórios/pastas para guardarmos os nossos trabalhos.
Todos os processos alheios aos editores (IDE's) faço-o na consola, no entanto estejam à vontade para o fazerem através do GUI (Graphical User Interface) sempre que quiserem e que seja possível claro.
Quanto ao editor, vou utilizar o vim (instalação através do apt:
Código: No tem permisso para visualizar links. Registar ou Login
apt-get install vim) mas quem quiser, pode usar o seu preferido :).


Bem, para já vou recomendar a criação de um directório onde vamos guardar os nossos projectos... É opcional, mas para quem quiser aqui fica... Abram uma consola e digitem os seguintes comandos:


Código: No tem permisso para visualizar links. Registar ou Login
mkdir -p ~/nodeprojects/portugalCode/helloWorld/
cd ~/nodeprojects/portugalCode/helloWorld/
O primeiro comando cria as pastas nodeprojects, portugalCODE e helloWorld de uma só vez... Sem a flag -p teríamos que as criar uma de cada vez.
O segundo comando obviamente coloca-nos na pasta helloWorld


Agora que já temos a nossa pasta do projecto criada, vamos então começar a programar. Para tal, vamos criar o nosso ficheiro .js:


Código: No tem permisso para visualizar links. Registar ou Login
vim helloWorld.js
Este comando "cria" (quando for gravado pela primeira vez) o ficheiro helloWorld.js e abre-o no editor vim.


O NodeJS, que assenta no motor de Javascript V8 da Google, tem a sua própria API que aconselho consultarem No tem permisso para visualizar links. Registar ou Login aqui e que vos ajudará a perceberem o comportamento de algumas linhas de código.


Temos então o ficheiro completamente vazio. A primeira coisa que vamos fazer é declarar uma variável e iniciá-la com o módulo 'http' (presente na API).
Este módulo permite-nos criar muito facilmente um "servidor web" muito simples que fica à escuta na porta que nós determinarmos... Mas já lá chegaremos:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');
Como podem ver os módulos são chamados através da função require().
Ora bem, já temos o módulo 'http' carregado na variável "http"... este módulo tem uma função/método chamado createServer() que retorna um servidor web :) vejamos a sua utilização na prática:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');


http.createServer(function(request,response){


});
Ora como podem ver, a variável http é declarada, depois chama a função createServer(), passando-lhe uma No tem permisso para visualizar links. Registar ou Login que é chamada sempre que é feito um pedido ao webserver :) fixe hum?
E quão fixe é isso? É tão fixe que, essa função recebe - automaticamente passado pelo httpServer - 2 objectos, o request e o response que são responsáveis por, um fornecer os dados necessários do pedido, e o outro fornecer mecanismos de resposta, respectivamente.


Como aquela função corre sempre que é feito um pedido ao servidor, de momento não está a fazer nada, certo?


Vamos então pôr o servidor a responder:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');


http.createServer(function(request,response){


  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();


});
Agora, a função já faz alguma coisa! Define o tipo de conteúdo que retorna e retorna depois o 'Hello World' e termina a resposta!
Sem o response.end() o browser iria continuar à espera de dados pois o servidor ainda não tinha terminado a ligação :).


O servidor está quase pronto, mas.... falta uma coisa... imaginem que então corríamos o nosso código... bem se isto é um servidor-web, em que porta vai "ouvir" ? Pois... falta definir isso... mas isso é simples :)


Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');


http.createServer(function(request,response){


  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();


})
.listen(4000);


Pronto :) agora com o método listen(), configurámos o servidor para trabalhar na porta 4000 :)


Gravem e saiam do editor (no vim, para quem não sabe é :wq)
Falta agora testar... na consola façam:


Código: No tem permisso para visualizar links. Registar ou Login
> node helloWorld.js


E abram um browser e acedam ao endereço No tem permisso para visualizar links. Registar ou Login (ou No tem permisso para visualizar links. Registar ou Login) e se tudo correr bem, irá aparecer um "Hello World" :)


Dou por concluído este post, onde aprendemos a criar um webserver e a retornar valores...! Quaisquer dúvidas, ou problemas, coloquem aqui uma resposta ao tópico com o assunto que eu responderei.


No próximo post, iremos manipular os pedidos de acordo com o que é pedido (endereços diferentes tratamentos diferentes).


Até lá, um abraço

NodeJS :: The ‘Hello World’

Ora então bem vindos a mais um post sobre NodeJS...


Neste post irei dar início a uma série de posts onde se fará código Javascript para NodeJS.
Tentarei ao máximo explicar o código, num processo quase linha-a-linha. No entanto, devem também estar atentos aos comentários no próprio código que poderão dar indicações-extra.


Antes de começar, começo pelos requisitos deste post:


  • São necessários conhecimentos intermédios de Javascript - Não é preciso ser-se um expert, mas convém saber o que são objectos em Javascript, como criar objectos e/ou arrays, manipulá-los, etc. Aquilo que um programador avançado consideraria "o básico" :)
  • Conhecimentos básicos de Redes - Não é preciso saber configurar redes, servidores, ou outras coisas. No entanto, noções de portas de rede, IP's entre outras coisas, serão necessárias para a total compreensão do post.


Ponto de Situação do trabalho já realizado:
No tem permisso para visualizar links. Registar ou Login


Objectivo final do post:
Ter um WebServer feito por nós a retornar a mensagem Hello World, feito em NodeJS


Realização:
Primeiro, vamos criar uma estrutura de directórios/pastas para guardarmos os nossos trabalhos.
Todos os processos alheios aos editores (IDE's) faço-o na consola, no entanto estejam à vontade para o fazerem através do GUI (Graphical User Interface) sempre que quiserem e que seja possível claro.
Quanto ao editor, vou utilizar o vim (instalação através do apt:
Código: No tem permisso para visualizar links. Registar ou Login
apt-get install vim) mas quem quiser, pode usar o seu preferido :).


Bem, para já vou recomendar a criação de um directório onde vamos guardar os nossos projectos... É opcional, mas para quem quiser aqui fica... Abram uma consola e digitem os seguintes comandos:


Código: No tem permisso para visualizar links. Registar ou Login
mkdir -p ~/nodeprojects/portugalCode/helloWorld/
cd ~/nodeprojects/portugalCode/helloWorld/
O primeiro comando cria as pastas nodeprojects, portugalCODE e helloWorld de uma só vez... Sem a flag -p teríamos que as criar uma de cada vez.
O segundo comando obviamente coloca-nos na pasta helloWorld


Agora que já temos a nossa pasta do projecto criada, vamos então começar a programar. Para tal, vamos criar o nosso ficheiro .js:


Código: No tem permisso para visualizar links. Registar ou Login
vim helloWorld.js
Este comando "cria" (quando for gravado pela primeira vez) o ficheiro helloWorld.js e abre-o no editor vim.


O NodeJS, que assenta no motor de Javascript V8 da Google, tem a sua própria API que aconselho consultarem No tem permisso para visualizar links. Registar ou Login]aqui e que vos ajudará a perceberem o comportamento de algumas linhas de código.


Temos então o ficheiro completamente vazio. A primeira coisa que vamos fazer é declarar uma variável e iniciá-la com o módulo 'http' (presente na API).
Este módulo permite-nos criar muito facilmente um "servidor web" muito simples que fica à escuta na porta que nós determinarmos... Mas já lá chegaremos:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');
Como podem ver os módulos são chamados através da função require().
Ora bem, já temos o módulo 'http' carregado na variável "http"... este módulo tem uma função/método chamado createServer() que retorna um servidor web :) vejamos a sua utilização na prática:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');


http.createServer(function(request,response){


});
Ora como podem ver, a variável http é declarada, depois chama a função createServer(), passando-lhe uma No tem permisso para visualizar links. Registar ou Login]função anónima que é chamada sempre que é feito um pedido ao webserver :) fixe hum?
E quão fixe é isso? É tão fixe que, essa função recebe - automaticamente passado pelo httpServer - 2 objectos, o request e o response que são responsáveis por, um fornecer os dados necessários do pedido, e o outro fornecer mecanismos de resposta, respectivamente.


Como aquela função corre sempre que é feito um pedido ao servidor, de momento não está a fazer nada, certo?


Vamos então pôr o servidor a responder:


Código: No tem permisso para visualizar links. Registar ou Login
var http = require('http');


http.createServer(function(request,response){


  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();


});
Agora, a função já faz alguma coisa! Define o tipo de conteúdo que retorna e retorna depois o 'Hello World' e termina a resposta!
Sem o response.end() o browser iria continuar à espera de dados pois o servidor ainda não tinha terminado a ligação :).


O servidor está quase pronto, mas.... falta uma coisa... imaginem que então corríamos o nosso código... bem se isto é um servidor-web, em que porta vai "ouvir" ? Pois... falta definir isso... mas isso é simples :)


Código: No tem permisso para visualizar links. Registar ou Login

var http = require('http');


http.createServer(function(request,response){


  response.writeHead(200,{
    'Content-Type' : 'text/html'
  });
  response.write('Hello World');
  response.end();


})
.listen(4000);


Pronto :) agora com o método listen(), configurámos o servidor para trabalhar na porta 4000 :)


Gravem e saiam do editor (no vim, para quem não sabe é :wq)
Falta agora testar... na consola façam:


Código: No tem permisso para visualizar links. Registar ou Login
> node helloWorld.js


E abram um browser e acedam ao endereço No tem permisso para visualizar links. Registar ou Login (ou No tem permisso para visualizar links. Registar ou Login) e se tudo correr bem, irá aparecer um "Hello World" :)


Dou por concluído este post, onde aprendemos a criar um webserver e a retornar valores...! Quaisquer dúvidas, ou problemas, coloquem aqui uma resposta ao tópico com o assunto que eu responderei.


No próximo post, iremos manipular os pedidos de acordo com o que é pedido (endereços diferentes tratamentos diferentes).


Até lá, um abraço