Parámetros POST con Node.js y Express

15/Ago/2015 NodeJS 4 Comentarios

Los parámetros POST son aquellos que se envían desde la página web al servidor sin que sean visibles en la URL. En el ejemplo de hoy vamos a ver como podemos pasar parámetros POST con Node.js y Express.

Lo primero que deberemos de conocer es que los parámetros POST no se envían en la URL si no que se envían en el cuerpo de la petición. Siendo el tipo de petición recibida por los servidores como application/x-www-form-urlencoded. Si bien el formato de los parámetros es el mismo que el utilizado por los parámetros GET.

parametro1=valor1&parametro2=valor2

En el caso de Express se cuenta con un middleware llamado body-parser el cual nos ayudará a acceder al contenido del cuerpo de los mensajes.

Para instalar el middleware body-parser en nuestra aplicación lo hacemos mediante npm.

$ npm install body-parser

Es por ello que lo primero que haremos será cargar los middleware express y body-parser.

var express = require('express');
var body_parser = require('body-parser');

Definimos la aplicación Express:

var app = express();

Y hacemos uso del middleware body-parser:

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

Esto será la inicialización de los middleware que vamos a utilizar. Pero luego deberemos de crear el código. Para ello vamos a utilizar la ruta «/saludo» para manejar las peticiones. Dentro de esta ruta vamos a utilizar las peticiones GET para pintar el formulario que nos haga la petición POST y la petición POST para recuperar los parámetros.

Mediante el método .get vamos a atender a las peticiones GET:

var formulario = '
' + '' + '' + '' + '
'; var cabecera = '

Saludo

'; app.get('/saludo', function (req, res) { res.send('' + cabecera + formulario + '' ); });

Vemos que el método get recibe dos parámetros con la request y la response. Sobre el elemento response devolvemos el contenido de la respuesta, en este caso el formulario. Formulario que envía los parámetros (en este caso el parámetro nombre) mediante el método POST.

Para conformar la petición POST vamos a utilizar el método .post

app.post('/saludo', function (req, res) {
	
	var nombre = req.body.nombre || '';
	var saludo = '';
	
	if (nombre != '')
		saludo = "Hola " + nombre;
	
	res.send(''
			+ cabecera
			+ '

' + saludo + '

' + formulario + '' ); });

Lo que vemos en el método post es que utilizamos el middleare body-parser para recuperar el valor del parámetro enviado por POST. La estructura para acceder a las variables será:

req.body.nombrevariable

En este caso como queremos acceder a la variable nombre utilizamos:

var nombre = req.body.nombre || '';

El operador OR nos servirá para asignar un valor vacío en el caso de que no llegue el parámetro.

Al igual que sucedía en el método .get vamos a utilizar el elemento response para devolver el contenido. En el cual ponemos el saludo y volvemos a incluir el formulario.

Ya solo nos quedará arrancar el servidor para poder ejecutar la prueba de enviar parámetros POST con Node.js y Express

var server = app.listen(8000, function () {
	  console.log('Servidor ejecutandose en localhost:8000');
});

De esta manera vemos lo sencillo que es enviar parámetros POST con Node.js y Express.

Vídeos sobre Node.js


4 comentarios en “Parámetros POST con Node.js y Express”

Víctor Cuervo

gonzalo

hola, estoy tratando de realizar una respuesta a una web app java que envía una notificación Como mensaje sms o wp, no importa eso, la app envia un post async, este post esta escrito en java, y yo lo que tengo que hacer en  node express, devolver la respuesta para que esta app, realice un callback y termine el envio del post.

no logro entender que es lo que hace el callback, que es lo que esta esperando que responda para seguir la funcion con exito, porque en la app en el log de errores me da WARN: SmS API error – Error at index 0 in: «null» – NumberFormatException (…)

 

el sevidor node a continuacion

async function inicial (message, Object, next)  {
  console.log(message.connection.remoteAddress);
  app.use(express.json()) // for parsing application/json
  app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

  const phone = phoneNumberFormatter(message.body.phone);
  const message1 = message.body.message;
  console.log(‘req’+ (message.body.phone));
  const isRegisteredNumber = await checkRegisteredNumber(phone);

  next();
  if (!isRegisteredNumber) {
    return Object.status(200).json({
      status: false,
      message: ‘The number is not registered’
    });
  }

  Object.status(200).json({
  phone: message.body.phone,
  message: message.body.message
  });
  console.log(‘inicial ‘ + Object);
  console.log(‘phone ‘ + message.body.phone);
  console.log(‘message ‘ + message.body.message);
  Object.end();

};
function final (Object, response, next) {

    next();

    const phone = phoneNumberFormatter(Object.body.phone);
    const message = Object.body.message;
  console.log(‘invocation ‘ + (Object.body.phone));
  console.log(‘telefono ‘ + phone);
    client.sendMessage(phone, message).then(response => {
      response.status(200).json({
        status: true,
        response: response
      });
    }).catch(err => {
      response.json({
        status: false,
       response: err
      });

    });
    console.log(‘reponse final  ‘ + response);
  };

app.post(‘/api/send/8s8d9s9fs9’, inicial, final);
app.get(‘/api/send/8s8d9s9fs9’, inicial, final);

con el codigo presedente, logre con posman realizar los envios con exito, pero cuando o hago con la app java, tira el error previsto en la parte de formato del numero, veo que es la parte del callback, por eso les solicito si me pueden explicar que es lo que esta pidiendo la funcion.

desde ya muchisimas gracias.

el codigo java

package org.acceso.notificators;

import com.fasterxml.jackson.annotation.JsonProperty;
import org.slf4j.LoggerFactory;
import org.acceso.model.User;
import javax.ws.rs.client.InvocationCallback;
import javax.ws.rs.client.Entity;
import org.acceso.notification.NotificationFormatter;
import org.acceso.model.Position;
import org.acceso.model.Event;
import org.acceso.Context;
import org.slf4j.Logger;

public class NotificatorSms extends Notificator
{
    private static final Logger LOGGER;
    private String url;
    private String token;

    public NotificatorSms() {
        this.url = ((Context.getConfig().getString(«notificator.sms.url») != null) ? (Context.getConfig().getString(«notificator.sms.url») + «/api/send/») : String.format(«http://sms.gpstracking.ar:%s/api/send/», Context.getConfig().getString(«notificator.sms.port»)));
        this.token = Context.getConfig().getString(«notificator.sms.token»);
    }

    @Override
    public void sendSync(final long userId, final Event event, final Position position) {
        final User user = Context.getPermissionsManager().getUser(userId);
        final Object sms= user.getSms();
        final String SmsNumber = (sms== null) ? «» : sms.toString();
        if (SmsNumber.length() > 0) {
            final Message message = new Message();
            message.phone = SmsNumber.toString();
            message.message = NotificationFormatter.formatSmsMessage(userId, event, position);
            Context.getClient().target(this.url + this.token).request().async().post(Entity.json((Object)message), (InvocationCallback)new InvocationCallback<Object>() {
                public void completed(final Object o) {
                }

                public void failed(final Throwable throwable) {
                    NotificatorSms.LOGGER.warn(«Sms API error», throwable);
                }
            });
        }
        else {
            NotificatorSms.LOGGER.warn(«Sms parameter error:», (Object)(«User » + user.getName() + » does not have Sms phone»));
        }
    }

    @Override
    public void sendAsync(final long userId, final Event event, final Position position) {
        this.sendSync(userId, event, position);
    }

    static {
        LOGGER = LoggerFactory.getLogger((Class)NotificatorSms.class);
    }

    public static class Message
    {
        @JsonProperty(«phone»)
        private String phone;
        @JsonProperty(«message»)
        private String message;
    }
}

Víctor Cuervo

Hugo

muy bueno

Víctor Cuervo

jorge

gracias me sirvió mucho. Entendí que se deben hacer los dos métodos, el GET y el POST.

Víctor Cuervo

Víctor Cuervo

Jorge, nos alegra mucho que te haya servido. :-D

Saludos.

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.