fetch函数是ES6新增的网络请求API,与传统的XMLHttpRequest相比,使用更加简洁方便。fetch函数使用promise来处理异步任务,但是在默认情况下,fetch函数只能发送跨域请求,不能发送同域请求。
为了解决这个问题,fetch函数提供了一个额外的选项,即"mode"选项,可以用来控制请求的模式。其中,"mode"选项有以下几个可用的值:
- "same-origin":只允许发送同域请求,如果请求地址不是同源的,会抛出跨域错误。
- "no-cors":只允许发送跨域请求,但是请求返回的数据会受到一些限制,如只能读取response的type和status属性,不能读取response的headers属性,而且不能使用response的json()、text()、blob()等方法解析返回的数据。
在使用"no-cors"模式时,fetch函数的response对象会变得非常受限制,这是因为浏览器实施了跨域安全策略,限制了对跨域请求返回的数据的访问。在这种情况下,只能通过判断response的type和status属性来确定请求是否成功,并且可以使用response的type属性来判断返回的数据类型,如"basic"表示返回的是纯文本,"cors"表示返回的是跨域请求。
以下是一个使用"no-cors"模式发送跨域请求的示例代码:
fetch('https://api.example.com/data', { mode: 'no-cors' })
.then(response => {
console.log(response.type); // "cors",表示返回的是跨域请求
console.log(response.status); // 请求的状态码
// 不能使用response的json()、text()、blob()等方法解析返回的数据
// 但是可以通过判断response的type来确定返回的数据类型,如文本、json等
})
.catch(error => {
console.log(error);
});
需要注意的是,"no-cors"模式只适用于发送不带身份验证凭证的请求,如果需要发送带身份验证凭证的请求,需要使用"same-origin"或"cors"模式。另外,使用"no-cors"模式发送的请求,不会触发浏览器的CORS预检请求。
总的来说,"no-cors"模式适用于那些只关心请求是否成功,并不关心具体的返回数据的情况,如发送某些统计请求等。对于需要访问返回数据的场景,建议使用"same-origin"或"cors"模式。