对于拦截全局 Fetch API 的请求和响应问题,我们可以使用 window.fetch
方法的第二个参数 init
来进行拦截。init
是一个配置对象,包含了 HTTP 请求的相关配置,其中,我们可以设置 init
中的 headers
属性来拦截请求和响应。
拦截 Fetch 请求
为了拦截 Fetch 请求,我们可以在 headers
中添加 fetch
属性来进行拦截,其值为一个匿名函数。这个函数接收两个参数,分别是请求对象 request
和请求配置对象 init
。在这个函数中,我们可以对请求进行修改,并返回修改后的请求对象 request
。
const oldFetch = window.fetch;
window.fetch = (url, options) => {
const headers = options.headers || {};
const fetchHandler = headers.fetch;
if (fetchHandler) {
delete headers.fetch;
const newOptions = fetchHandler({ url, options });
return oldFetch(newOptions.url, newOptions.options);
}
return oldFetch(url, options);
}
// 添加 fetch 拦截器
window.fetch('http://example.com/api/data', {
method: 'GET',
headers: {
fetch: async ({ url, options }) => {
options.headers.Authorization = 'Bearer TOKEN';
return { url, options };
},
},
})
在上面的代码中,我们使用 oldFetch
保存了全局 window.fetch
方法,并将 window.fetch
方法重写。在新的 window.fetch
方法中,我们判断 options
中是否有 headers
属性中的 fetch
属性,并将其取出来,然后调用拦截器函数进行处理,并将处理结果应用到原始的 options
中,最后使用 oldFetch
方法进行请求。
在上面示例中,我们使用 async
把拦截器函数包装成异步函数。在拦截器函数中,我们添加了 Authorization
请求头,并返回修改后的 options
对象,以便用新的请求头和原始 URL 调用 oldFetch
进行请求。
拦截 Fetch 响应
在拦截 Fetch 响应时,我们可以在响应对象的 headers
属性中添加 fetch
属性来进行拦截。fetch
也是一个匿名函数,接收一个参数 response
。这个函数中,我们可以对响应进行修改,并返回修改后的响应对象 response
。
const oldFetch = window.fetch;
window.fetch = async (url, options) => {
const response = await oldFetch(url, options);
const headers = response.headers || {};
const fetchHandler = headers.fetch;
if (fetchHandler) {
delete headers.fetch;
const modifiedResponse = await fetchHandler(response);
return modifiedResponse;
}
return response;
}
// 添加 fetch 拦截器
window.fetch('http://example.com/api/data', {
method: 'GET',
headers: {
Authorization: 'Bearer TOKEN',
fetch: async (response) => {
const data = await response.json();
data.message = 'Hello World!';
return new Response(JSON.stringify(data), response);
},
},
})
在上面的代码中,我们同样使用 oldFetch
保存了全局 window.fetch
方法,并将其重写。在新的 window.fetch
方法中,我们首先调用了 oldFetch
方法,获取被拦截的响应。然后我们取出响应对象的 headers
属性中的 fetch
属性,并将其取出来,调用拦截器函数,并返回修改后的响应对象。
在上面示例中,我们使用 async
把拦截器函数包装成异步函数。在拦截器函数中,我们首先使用 await
调用响应对象的 json
方法,解析响应体。然后,我们添加了一个新的 message
字段并返回修改后的响应对象,以便用新的响应数据进行响应。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 中如何拦截全局 Fetch API 的请求和响应问题 - Python技术站