Revista Informática

Node.js y Express: Peticiones y Respuestas

Publicado el 21 octubre 2013 por Codehero @codeheroblog

Request

El objeto request contiene información sobre la petición que hace el cliente al servidor.

Hablemos de sus propiedades.

Headers

Si queremos saber información sobre la petición podemos obtener los headers utilizando el método “get”:

app.get("/", function(request, response) { response.send(request.get('user-agent')); });

12345 appget("/",function(request,response){   responsesend(requestget('user-agent'));  });

Si visitamos esta ruta obtendremos un mensaje similar al siguiente:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36

1 Mozilla/5.0(Macintosh;Intel Mac OSX10_8_5)AppleWebKit/537.36(KHTML,like Gecko)Chrome/27.0.1453.93Safari/537.36

Si queremos una lista de los “content types” aceptados podemos invocar la propiedad accepted:

app.get("/", function(request, response) { response.send(request.accepted); });

12345 appget("/",function(request,response){   responsesend(requestaccepted);  });

Esto retornará una lista de los contenidos aceptados similar a la siguiente:

[ { "value": "text/html", "quality": 1, "params": {}, "originalIndex": 0, "type": "text", "subtype": "html" }, { "value": "application/xhtml+xml", "quality": 1, "params": {}, "originalIndex": 1, "type": "application", "subtype": "xhtml+xml" }, { "value": "application/xml", "quality": 0.9, "params": {}, "originalIndex": 2, "type": "application", "subtype": "xml" }, { "value": "*/*", "quality": 0.8, "params": {}, "originalIndex": 3, "type": "*", "subtype": "*" } ]

12345678910111213141516171819202122232425262728293031323334 [  {  "value":"text/html",  "quality":1,  "params":{},  "originalIndex":0,  "type":"text",  "subtype":"html"  },  {  "value":"application/xhtml+xml",  "quality":1,  "params":{},  "originalIndex":1,  "type":"application",  "subtype":"xhtml+xml"  },  {  "value":"application/xml",  "quality":0.9,  "params":{},  "originalIndex":2,  "type":"application",  "subtype":"xml"  },  {  "value":"*/*",  "quality":0.8,  "params":{},  "originalIndex":3,  "type":"*",  "subtype":"*"  }]

También podemos verificar “character sets” utilizando acceptedCharsets:

app.get("/", function(request, response) { response.send(request.acceptedCharsets); });

12345 appget("/",function(request,response){   responsesend(requestacceptedCharsets);  });

Y esto retornara una lista con los character sets aceptados. También podemos preguntar por uno en especifico:

app.get("/", function(request, response) { response.send(request.acceptsCharset('utf-8') ? 'yes' : 'no'); });

12345 appget("/",function(request,response){   responsesend(requestacceptsCharset('utf-8')?'yes':'no');  });

Y aquí le pongo ? 'yes' : 'no' porque esta función retorna un valor booleano.

Podemos preguntar por el idioma aceptado en este request:

app.get("/", function(request, response) { response.send(request.acceptedLanguages); });

12345 appget("/",function(request,response){   responsesend(requestacceptedLanguages);  });

Esto retornará una lista de con los idiomas aceptados.

Igualmente que con los character sets, podemos pedir uno en especifico:

app.get("/a", function(request, response) { response.send(request.acceptsLanguage('es') ? 'yes' : 'no'); });

12345 appget("/a",function(request,response){   responsesend(requestacceptsLanguage('es')?'yes':'no');  });

Parámetros

Sobre los parámetros ya hablamos en el capitulo “definiendo rutas”. Por lo tanto aquí solo voy a agregar alunas cosas que no mencioné anteriormente.

Como bien sabemos podemos solicitar el parámetro enviado en el url de la siguiente manera:

app.get("/name/:name", function(request, response) { response.send("Hola, " + request.params.name); });

12345 appget("/name/:name",function(request,response){   responsesend("Hola, "+requestparamsname);  });

Lo nuevo que voy a introducir es la posibilidad de hacer un parámetro opcional. Esto se logra agregando un ? al final del url:

app.get("/name/:name?", function(request, response) { response.send("Hola, " + request.params.name); });

12345 appget("/name/:name?",function(request,response){   responsesend("Hola, "+requestparamsname);  });

También podemos agregar un valor por defecto al parámetro usando el método param en vez de la propiedad params:

app.get("/name/:name?", function(request, response) { response.send(request.param('name', 'valor default')); });

12345 appget("/name/:name?",function(request,response){   responsesend(requestparam('name','valor default'));  });

Otras propiedades

Estas fueron algunas de la propiedades más usadas del objeto request, hay muchas otras que no voy a explicar pero que puedes conseguir en la documentación del framework. Estas son:

  • protocol
  • secure
  • ip
  • ips
  • auth
  • subdomains
  • path
  • host
  • fresh
  • stale
  • xhr

Response

También hay mucho que puede hacerse con el objeto response. Veamos.

Códigos de estatus

El método send lo hemos venido usando para enviar el body de nuestra respuesta, pero también podemos enviar un código de estatus con un mensaje custom:

app.get("/a", function(request, response) { response.send(403, 'prohibido el acceso :P'); });

12345 appget("/a",function(request,response){   responsesend(403,'prohibido el acceso :P');  });

Si enviamos el código solo obtendremos el mensaje estándar para este código.

Para mayor información sobre códigos de estatus del protocolo http visita la siguiente página de wikipedia.

Enviando json

Para enviar json solo hay que usar el método json:

app.get("/", function(request, response) { response.json({ message: '¡hola!'}); });

12345 appget("/",function(request,response){   responsejson({message:'¡hola!'});  });

Aqui estamos enviando un objeto de javascript, el método json se encarga de hacerle “stringify” y mandarlo con “content type” = “application/json”.

Asignando el content type

Normalmente el content type se asigna automaticamente, pero podemos asignarlo manualmente si queremos:

app.get("/", function(request, response) { response.type('image/png').send('esto es una imagen'); });

12345 appget("/",function(request,response){   responsetype('image/png')send('esto es una imagen');  });

Formato

El método formar retorna el tipo de respuesta que el cliente pueda aceptar:

app.get("/", function(request, response) { response.format({ html: function() { response.send('<h1> Hola </h1>'); }, json: function() { response.json({ message: "Hola" }) }, text: function() { response.send("hola") }, }); });

123456789 appget("/",function(request,response){   responseformat({  html:function(){responsesend('<h1> Hola </h1>');},  json:function(){responsejson({message:"Hola"})},  text:function(){responsesend("hola")},  });  });

Si pedimos esta ruta en el browser vamos a obtener la respuesta “Hola” en un “H1″, pero si vamos a la consola podemos obtener las otras respuestas:

$ curl localhost:3000 -H "accept: application/json" { "message": "Hola" } $ curl localhost:3000 -H "accept: text/plain" hola

1234567 $curl localhost:3000-H"accept: application/json"{  "message":"Hola"} $curl localhost:3000-H"accept: text/plain"hola

redireccionando

Redireccionar es tan simple como llamar al método:

app.get("/", function(request, response) { response.redirect('/name'); });

12345 appget("/",function(request,response){   responseredirect('/name');  });

Otros métodos

Nuevamente, no voy a hablar de todas las propiedades y métodos de este objeto, sin embargo les dejo aquí la lista de cuales existen para su investigación personal:

  • sendfile
  • download
  • attachment
  • links
  • clearCookie
  • cookies

Conclusión

Con los conocimientos obtenidos hoy ya tenemos una base sólida sobre las peticiones y respuestas en Express.

Espero haber sido de ayuda. Como siempre, nunca esta de más decir que cualquier duda puede ser aclarada en la sección de comentarios más abajo.

Adiós.


Volver a la Portada de Logo Paperblog

Dossiers Paperblog