Manejo de solicitudes HTTP con jQuery Ajax, Fetch y Axios junto con FormData

Tipo comunes de Content-Type

application/x-www-form-urlencoded
Los datos se convierten en pares clave-valor codificados como clave1=valor1&clave2=valor2, dondee tanto las claves como los valores están codificados en URL.

multipart/form-data (para envío de archivos)
Procesa los datos del formulario como un mensaje único, dividiendo cada campo con un delimitador específico.

application/json
Transforma los datos en una cadena serializada en formato JSON

application/octet-stream
Flujo binario de archivo

text/xml para transmisión y almacenamiento de datos

Utilización de FormData

// Crear instancia de FormData
// const formDatos = new FormData();

// Obtener FormData desde un formulario existente
const formDatos = new FormData(document.getElementById(identificadorDom));

// Incorporar información
formDatos.append("campo1", "dato1");
formDatos.append("campo1", "dato2");
formDatos.append("campo1", "dato3");

// Recuperar valor por clave
console.log(formDatos.get("campo1"));
console.log(formDatos.getAll("campo1"));

// Modificar valor existente
formDatos.set("campo1", "nuevoValor");
console.log(formDatos.getAll("campo1"));

// Verificar existencia de clave
console.log(formDatos.has("campo1"));

// Eliminar entrada específica
formDatos.delete("campo1");
console.log(formDatos.has("campo1"));

formDatos.set("campo1", "dato1");
// Iteración de elementos
for (let [llave, valor] of formDatos.entries()) {
    console.log(llave, valor);
}

Solicitudes POST con jQuery Ajax

<form id="formulario">
    <input type="text" name="usuario" value="juan" />
    <input type="file" name="archivo" />
</form>
<button type="button" onclick="enviarJquerySerializado('formulario')">jQuery Ajax serializado</button>
<button type="button" onclick="enviarJqueryFormData('formulario')">jQuery Ajax FormData</button>
<button type="button" onclick="enviarJqueryJson()">jQuery Ajax JSON</button>

<script>
    const direccion = "http://localhost:3000/php-demos/solicitud.php";
    
    function enviarJquerySerializado(idElemento) {
      const datosSerializados = $("#" + idElemento).serialize();
      $.ajax({
        url: direccion,
        type: "post",
        data: datosSerializados,
        dataType: "json",
        beforeSend: function () {},
        success: function (respuesta) {
          console.log(respuesta);
        },
        error: function (objetoXhr, estadoTexto, errorLanzado) {
          console.log(estadoTexto, errorLanzado);
        },
      });
    }

    function enviarJqueryFormData(idElemento) {
      const formDatos = new FormData(document.getElementById(idElemento));
      $.ajax({
        type: "post",
        url: direccion,
        data: formDatos,
        dataType: "json",
        cache: false,
        processData: false,
        contentType: false,
        beforeSend: function () {},
      })
        .done(function (resultado, estadoTexto, objetoXhr) {
          console.log(resultado, estadoTexto);
        })
        .fail(function (objetoXhr, estadoTexto, errorLanzado) {
          console.log(estadoTexto, errorLanzado);
        })
        .always(function (datos, estadoTexto, objetoXhr) {
        });
    }

    function enviarJqueryJson() {
      const cadenaDatos = JSON.stringify({ x: 5, y: 10 });
      $.ajax({
        url: direccion,
        type: "post",
        cache: false,
        data: cadenaDatos,
        dataType: "json",
        processData: false,
        contentType: "application/json",
        success: function (respuesta) {
          console.log(respuesta);
        },
        beforeSend: function () {},
        error: function () {},
      });
    }
</script>

<solicitud.php> $_REQUEST, 'archivos' => $_FILES, 'contenido_crudo' => $contenidoCrudo, 'json_datos' => $datosJson]); </solicitud.php>### Respuestas obtenidas

// Respuesta al enviar datos serializados del formulario
{"informacion":{"usuario":"juan"},"archivos":[],"contenido_crudo":"usuario=juan","json_datos":null}

// Respuesta al enviar datos FormData
{"informacion":{"usuario":"juan"},"archivos":{"archivo":{"name":"documento.pdf","type":"application/pdf","tmp_name":"C:\\Temp\\tempFile.tmp","error":0,"size":4500}},"contenido_crudo":"","json_datos":null}

// Respuesta al enviar datos JSON
{"informacion":[],"archivos":[],"contenido_crudo":"{\"x\":5,\"y\":10}","json_datos":{"x":5,"y":10}}

Implementación con Fetch API

<button type="button" onclick="enviarFetchSerializado('formulario')">Fetch serializado</button>
<button type="button" onclick="enviarFetchFormData('formulario')">Fetch FormData</button>
<button type="button" onclick="enviarFetchJson()">Fetch JSON</button>

<script>
    function enviarFetchSerializado(idElemento) {
      const datosSerializados = $("#" + idElemento).serialize();
      fetch(direccion, {
        method: "post",
        body: datosSerializados,
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
      })
        .then((respuesta) => {
          if (!respuesta.ok) {
            throw new Error(respuesta.statusText);
          }
          return respuesta.json();
        })
        .then((respuesta) => console.log(respuesta))
        .catch((error) => console.log(error));
    }

    function enviarFetchFormData(idElemento) {
      const formDatos = new FormData(document.getElementById(idElemento));
      fetch(direccion, {
        method: "post",
        body: formDatos,
      })
        .then((respuesta) => {
          if (!respuesta.ok) {
            throw new Error(respuesta.statusText);
          }
          return respuesta.json();
        })
        .then((respuesta) => console.log(respuesta))
        .catch((error) => console.log(error));
    }

    function enviarFetchJson() {
      const cadenaDatos = JSON.stringify({ x: 5, y: 10 });
      fetch(direccion, {
        method: "post",
        body: cadenaDatos,
        headers: {
          "Content-Type": "application/json",
        },
      })
        .then((respuesta) => respuesta.json())
        .then((respuesta) => console.log(respuesta))
        .catch((error) => console.log(error));
    }
</script>

Implementación con Axios

<button type="button" onclick="enviarAxiosSerializado('formulario')">Axios serializado</button>
<button type="button" onclick="enviarAxiosFormData('formulario')">Axios FormData</button>
<button type="button" onclick="enviarAxiosJson()">Axios JSON</button>

<script>
    function enviarAxiosSerializado(idElemento) {
      const datosSerializados = $("#" + idElemento).serialize();
      axios({
        method: "post",
        url: direccion,
        data: datosSerializados,
        headers: { "Content-Type": "application/x-www-form-urlencoded" },
      })
        .then((respuesta) => {
          if (respuesta.status == "200") {
            console.log(respuesta.data);
          }
        })
        .catch((error) => console.log(error));
    }

    function enviarAxiosFormData(idElemento) {
      const formDatos = new FormData(document.getElementById(idElemento));
      axios({
        method: "post",
        url: direccion,
        data: formDatos,
        headers: { "Content-Type": "multipart/form-data" },
      })
        .then((respuesta) => {
          if (respuesta.status == "200") {
            console.log(respuesta.data);
          }
        })
        .catch((error) => console.log(error));
    }

    function enviarAxiosJson() {
      const objetoDatos = { x: 5, y: 10 };
      axios({
        method: "post",
        url: direccion,
        data: objetoDatos,
      })
        .then((respuesta) => {
          if (respuesta.status == "200") {
            console.log(respuesta.data);
          }
        })
        .catch((error) => {
          if (error.response) {
            console.log(error.response.data);
            console.log(error.response.status);
            console.log(error.response.headers);
          } else if (error.request) {
            console.log(error.request);
          } else {
            console.log("Error", error.message);
          }
        });
    }
</script>

Etiquetas: JavaScript jQuery AJAX fetch-api axios

Publicado el 10-9 10:25