https://developer.mozilla.org/en/docs/Web/API/Service_Worker_API
Service Worker 本质上充当位于 Web 应用程序、浏览器和网络(如果可用)之间的代理服务器。
它采用JavaScript文件的形式,可以控制与之关联的网页/站点,拦截和修改导航和资源请求
您通过以下方式在您的应用程序代码中注册一个服务工作者,例如,sw.js:
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);
});
});
}
在sw.js 文件中(实际的 service-worker 代码):要拦截请求,您将 fetch 事件侦听器附加到调用 respondWith() 方法并使用 .request 执行某些操作的 service worker来自事件对象的成员:
self.addEventListener('fetch', function(event) {
event.respondWith(
// intercept requests by handling event.request here
);
});
一个简单的服务工作者,只是通过请求不变看起来像这样:
self.addEventListener('fetch', function(event) {
event.respondWith(
fetch(event.request)
);
});
要将参数添加到请求正文中,您需要:
- 序列化请求。
- 修改该序列化请求。
- 反序列化修改后的请求以创建新请求。
- 致电
fetch(…) 提出新请求。
所以,一个服务工作者会做所有看起来像这样的事情(未经测试):
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);
});
}); // fixed this
}
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));
}
注意:https://serviceworke.rs/request-deferrer_service-worker_doc.html,来自Service Worker Cookbook 的页面,是我从serialize(…) 代码/方法中提取的地方——通过https://stackoverflow.com/questions/35420980/how-to-alter-the-headers-of-a-request/35421644#35421644—and 的答案,值得一试看一下,因为那里的代码有详细的注释解释它在做什么