使用fetch post json数据的问题

本文探讨了在使用fetch进行POST请求发送JSON数据时遇到的数据类型不支持和非JSON数据错误。问题源于fetch的mode设置不当以及body字段未正确序列化。解决方案是将mode设置为'cors'并确保使用JSON.stringify序列化JSON数据。同时,若需携带credentials,需设置credentials: 'include'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

在项目中使用fetch框架,向一个服务器发送JSON数据,请求方式为post

let myHeaders = new Headers();
myHeaders.append('Content-Type', 'application/json');
let request = new Request('./api', {
       method: 'POST', 
       mode: 'no-cors',
       body:JSON.stringify(tubState),
       headers:myHeaders
});
fetch(request)
   .then(response => response.json())
   .then(result =>{
   })
 }

将mode设置为no-cors 是指不允许发送跨域请求。执行以上代码后,得到以下报错信息:

这里写图片描述

这里写图片描述

两个报错信息,第一个提示:数据类型不支持
第二个提示:不是JSON数据

原因

经过排查发现是如下原因导致:

在使用fetch时,如果设置mode : 'no-cors' 将会导致 request Header 不可变,也即不可设置。从第二张截图中我们发现,content-type 属性为text/plain, 而并非是我们所设置的application/json.所以也就产生了第二个报错信息。

问题的解决方法是:将mode 设置为 cors 即可

注意:在使用fetch post json 数据时,body字段应该使用JSON.stringify 序列化


2-25日补充:

fetch credentials

fetch请求默认是不带cookie 的,如果服务端需要接受cookie 做登陆验证的话,需要设置参数credentials : fetch(url, {credentials: 'include'})

credentials枚举属性决定了cookies是否能跨域得到。这个属性与XHR的withCredentials标志相同,但是只有三个值,分别是omit(默认),same-origin以及include

Reference

fetch MDN document

Github issue

关于cors 以及 fetch

传统AJAX已死fetch永生

fetch web请求实践
fetch

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值