Encapsulamiento de solicitudes HTTP para mini programas WeChat

La función wx.request(Object object) en mini programas WeChat se utiliza para realizar solicitudes HTTPS a servidores. A continuación, se presenta una implementación personalizada que mejora su usabilidad mediante promesas y manejo de errores.

Ejemplo básico de uso:

wx.request({
  url: '/api/recursos',
  data: {
    clave: 'valor',
    id: '123'
  },
  header: {
    'Content-Type': 'application/json'
  },
  success: function(respuesta) {
    console.log(respuesta.data);
  },
  fail: function(error) {
    console.error('Solicitud fallida:', error);
  }
});

Para simplificar las llmaadas y añadir funcionalidades comunes como indicadores de carga y manejo de tokens, se define un módulo de encapsulamiento.

Módulo de API (api.js)

const aplicacion = getApp();
const registro = require('../utils/registro');

function ejecutarSolicitud(ruta, parametros, mostrarCarga = false) {
  return new Promise((resolver, rechazar) => {
    if (mostrarCarga) {
      wx.showLoading({ title: 'Procesando...' });
    }
    wx.request({
      url: `${aplicacion.globalData.host}${ruta}`,
      method: parametros.metodo,
      data: parametros.datos,
      header: {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': aplicacion.globalData.tokenAcceso
      },
      timeout: 15000,
      success: function(respuesta) {
        if (respuesta.statusCode === 200) {
          resolver(respuesta.data);
        } else if ([401, 403].includes(respuesta.statusCode)) {
          wx.reLaunch({ url: '/pages/inicio/inicio' });
          rechazar(respuesta.data);
        } else if (respuesta.statusCode >= 500) {
          wx.showToast({ title: 'Error en el servidor', icon: 'none' });
          registro.error('api.js: Error del servidor', respuesta);
          rechazar(respuesta.data);
        } else {
          wx.showToast({ title: 'Solicitud no válida', icon: 'none' });
          registro.error('api.js: Código de estado inesperado', respuesta);
          rechazar(respuesta.data);
        }
      },
      fail: function(err) {
        wx.showToast({ title: 'Conexión fallida', icon: 'none' });
        registro.error('api.js: Fallo de red', err);
        rechazar(err);
      },
      complete: function() {
        if (mostrarCarga) {
          wx.hideLoading();
        }
      }
    });
  });
}

const solicitarGet = (ruta, datos = {}) => {
  return ejecutarSolicitud(ruta, { metodo: 'GET', datos }, false);
};

const solicitarGetConCarga = (ruta, datos = {}) => {
  return ejecutarSolicitud(ruta, { metodo: 'GET', datos }, true);
};

const solicitarPost = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'POST', datos }, false);
};

const solicitarPostConCarga = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'POST', datos }, true);
};

const solicitarPut = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'PUT', datos }, false);
};

const solicitarPutConCarga = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'PUT', datos }, true);
};

const eliminarRecurso = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'DELETE', datos }, false);
};

const eliminarRecursoConCarga = (ruta, datos) => {
  return ejecutarSolicitud(ruta, { metodo: 'DELETE', datos }, true);
};

module.exports = {
  solicitarGet,
  solicitarGetConCarga,
  solicitarPost,
  solicitarPostConCarga,
  solicitarPut,
  solicitarPutConCarga,
  eliminarRecurso,
  eliminarRecursoConCarga
};

Ejemplo de implementación

const api = require('../../api/api');
Page({
  onLoad: function() {
    api.solicitarPost('/autenticacion', {
      usuario: 'ejemplo',
      contrasena: 'clave123'
    }).then(function(resultado) {
      if (resultado.estado === 'exito') {
        wx.setStorageSync('sesion', resultado.token);
      }
    }).catch(function(error) {
      wx.showToast({ title: error.mensaje, icon: 'none' });
    });
  }
});

Parámetros de datos

Los datos enviados al servidor se convierten a cadenas de texto según el método HTTP:

  • Para solicitudes GET, los datos se serializan como una cadena de consulta (query string).
  • Para solicitudes POST con encabezado Content-Type: application/json, los datos se pasan como JSON.
  • Para solicitudes POST con encabezado Content-Type: application/x-www-form-urlencoded, los datos se codifican como una cadena de consulta.

Etiquetas: WeChat Mini Programs JavaScript wx.request HTTP

Publicado el 7-14 01:16