fetch是比较基础的API,很多参数需要自家设置。在进行跨域POST请求时,有以下一个重要参数:
method
指定请求方式,可选值:GET | POST | PUT | DELETE | OPTIONS。默认值:GET。
credentials
指定在发送cookies的情况,可选值:omit | same-origin | include。 默认值:same-origin。
omit: 不发送cookies
same-origin: 在同域情况下发送cookies
include: 同域或跨域都发送cookies
headers
头文件,向服务器说明希望的到什么待遇,这里主要用到Content-Type
Content-Type: 向服务器说明我们发送的body是什么类型
前端代码
fetch(url, {
method: ‘post’,
body: JSON.stringify({
uname: ‘张三’,
pwd: ‘456’
}),
headers: {
‘Content-Type’: ‘application/json’
},
mode: “cors”,
})
.then(function(data) {
return data.text();
}).then(function(data) {
console.log(data)
});
网页显示的错误
检测发现语法没有错误但是说cors错误,明显产生了跨域问题,查找资料发现
标准请求头的‘Content-Type’ 形式是有3种
:Content-Type 的值仅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded;
所以写的json形式就是非标准请求头,非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。
解决问题方法
在服务端加上origin ,
app.all(’*’, function(req, res, next) {
var origin = req.headers.origin;
res.header(‘Access-Control-Allow-Origin’, origin);
res.header(‘Access-Control-Allow-Methods’, ‘PUT, GET, POST, DELETE, OPTIONS,PATCH,TRACE’)
res.header(‘Access-Control-Allow-Headers’, ‘mytoken’);
res.header(“Access-Control-Allow-Headers”, “Origin, X-Requested-With, Content-Type, Accept”);
res.header(“Access-Control-Allow-Credentials”, true)
next();
});
参考:http://www.ruanyifeng.com/blog/2016/04/cors.html