post thumbnail

Node.js y Express: Peticiones y Respuestas

Publicado Por: Oscar González, El 21/10/2013


Detalles del Curso:

Dificultad: Novato

Duración: 10 min


A lo largo de esta serie hemos utilizado los parámetros "request" y "response" que recibimos en los métodos de los controladores para cada ruta. En este capítulo voy a profundizar en este tema para mostrarte varias capacidades que no te imaginabas que estos dos objetos tenían y lo importantes o útiles que pueden ser para el desarrollo de nuestras aplicaciones.


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

});

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

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

app.get("/", function(request, response) {

    response.send(request.accepted);

});

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": "*"
  }
]

También podemos verificar "character sets" utilizando acceptedCharsets:

app.get("/", function(request, response) {

    response.send(request.acceptedCharsets);

});

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

});

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

});

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

});

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

});

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

});

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

});

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

});

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!'});

});

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

});

Formato

El método format 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") },
  });

});

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

redireccionando

Redireccionar es tan simple como llamar al método:

app.get("/", function(request, response) {

  response.redirect('/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.


¿Te ha gustado esta publicación?

Compártela:

Por Oscar González

Conoce más sobre este autor aquí


comments powered by Disqus