javascript ajax http xmlhttprequest http-proxy

javascript - Cómo interceptar todas las solicitudes http, incluidos los envíos de formularios



ajax xmlhttprequest (2)

prueba este código:

(function(send) { XMLHttpRequest.prototype.send = function(data) { var _valuToAdd = $("input[name=''valuToAdd'']").val(); this.setRequestHeader(''valueName'', _valuToAdd); send.call(this, data); }; })(XMLHttpRequest.prototype.send);

Me gustaría interceptar todas las solicitudes http que salen de mi página web y agregar un parámetro al cuerpo de la solicitud. Mi página incluye formularios: también quiero capturar los envíos de formularios. Intenté usar Jquery ajaxSend y setRequestHeader de Javascript, pero ambos no funcionaron para mí. ¿Cómo logro esto?

Gracias


https://developer.mozilla.org/en/docs/Web/API/Service_Worker_API

Los trabajadores de servicios esencialmente actúan como servidores proxy que se ubican entre las aplicaciones web y el navegador y la red (cuando están disponibles).

Toma la forma de un archivo JavaScript que puede controlar la página web / sitio al que está asociado, interceptando y modificando la navegación y las solicitudes de recursos.

Usted registra un trabajador de servicio en su código de aplicación desde un archivo llamado, por ejemplo, sw.js haciendo esto:

if (''serviceWorker'' in navigator) { window.addEventListener(''load'', function() { navigator.serviceWorker.register(''sw.js'').then(function(registration) { console.log(''Service worker registered with scope: '', registration.scope); }, function(err) { console.log(''ServiceWorker registration failed: '', err); }); }); }

Y en el archivo sw.js (el código real de trabajador de servicio): para interceptar solicitudes, adjunta un detector de eventos de fetch al trabajador de servicio que llama al método respondWith() y hace algo con el miembro .request del objeto de evento:

self.addEventListener(''fetch'', function(event) { event.respondWith( // intercept requests by handling event.request here ); });

Un trabajador de servicio simple que solo pasa solicitudes sin cambios se ve así:

self.addEventListener(''fetch'', function(event) { event.respondWith( fetch(event.request) ); });

Para agregar un parámetro al cuerpo de la solicitud, creo que necesita serializar la solicitud, modificar esa solicitud serializada, luego deserializarla para recrear una nueva solicitud, luego llamar a fetch(…) con esa nueva solicitud.

Así que creo que un trabajador de servicio que hace todo lo que se vería así (sin probar):

self.addEventListener(''fetch'', function(event) { event.respondWith( fetchWithParamAddedToRequestBody(event.request) ); }); function fetchWithParamAddedToRequestBody(request) { serialize(request).then(function(serialized) { // modify serialized.body here to add your request parameter deserialize(serialized).then(function(request) { return fetch(request); }); } function serialize(request) { var headers = {}; for (var entry of request.headers.entries()) { headers[entry[0]] = entry[1]; } var serialized = { url: request.url, headers: headers, method: request.method, mode: request.mode, credentials: request.credentials, cache: request.cache, redirect: request.redirect, referrer: request.referrer }; if (request.method !== ''GET'' && request.method !== ''HEAD'') { return request.clone().text().then(function(body) { serialized.body = body; return Promise.resolve(serialized); }); } return Promise.resolve(serialized); } function deserialize(data) { return Promise.resolve(new Request(data.url, data)); }

Nota: https://serviceworke.rs/request-deferrer_service-worker_doc.html , una página del Service Worker Cookbook , es donde levanté ese código / enfoque de serialize(…) través de la respuesta en Cómo modificar el encabezados de una solicitud? —Y vale la pena echarle un vistazo, porque el código tiene anotaciones detalladas que explican lo que está haciendo todo