我尝试了ReactJS对REST-API的fetch调用,并希望处理响应。调用成功,我得到了一个响应,我可以在Chrome开发工具中看到:
function getAllCourses() {
fetch('http://localhost:8080/course', {
method: 'POST',
mode: 'no-cors',
credentials: 'same-origin',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
objectClass: 'course',
crud: '2'
})
}).then(function (response) {
console.log(response);
return response.json();
}).catch(function (err) {
console.log(err)
});
}
当我尝试处理响应时,我得到了一个“SyntaxError:输入“”的意外结束
return response.json();
console.log看起来像这样:
我的响应JSON看起来像这样,它是有效的,我用jsonlint检查了它:
[
{
"0x1": {
"users": [],
"lectures": [],
"owner": "0x2",
"title": "WWI 14 SEA",
"description": null,
"objectClass": "course",
"id": "course_00001"
},
"0x2": {
"username": "system",
"lectures": [],
"course": null,
"solutions": [],
"exercises": [],
"roles": [
"0x3",
"0x4",
"0x5"
],
"objectClass": "user",
"id": "user_00001"
},
"0x3": {
"roleName": "ROLE_ADMIN",
"objectClass": "role",
"id": "role_00001"
},
"0x4": {
"roleName": "ROLE_STUDENT",
"objectClass": "role",
"id": "role_00002"
},
"0x5": {
"roleName": "ROLE_DOCENT",
"objectClass": "role",
"id": "role_00003"
}
}
]
6条答案
按热度按时间nzkunb0c1#
您需要从请求中删除
mode: 'no-cors'
设置。设置no-cors
模式正是您遇到问题的原因。no-cors
请求的响应类型为opaque
。问题中的日志片段表明了这一点。Opaque 意味着你的前端JavaScript代码看不到响应体或头。https://developer.mozilla.org/en-US/docs/Web/API/Request/mode解释说:
no-cors
- JavaScript不能访问结果Response
的任何属性因此,设置
no-cors
模式的效果本质上是告诉浏览器,*“不要让前端JavaScript代码在任何情况下访问响应体或头。当响应不包含
Access-Control-Allow-Origin
响应头时,人们有时会尝试设置no-cors
模式,或者因为请求是触发CORS预处理的请求,所以您的浏览器会执行OPTIONS
预处理。但是使用
no-cors
模式并不能解决这些问题。解决办法是:Access-Control-Allow-Origin
响应头,并处理OPTIONS
请求5lhxktic2#
在你的
then
中,你应该在返回response.json
之前检查响应是否正常:如果你想在你的rejected promise中有错误消息,你可以这样做:
7xzttuei3#
我知道这个答案可能是超级晚,可能已经得到解决,但我只是有同样的问题,今天,我只需要添加一个','在年底的标题散列,我停止得到错误
gab6jxml4#
您可以通过在php或其他服务器端点的头中添加行来避免CORS策略的问题:
使用POST请求的工作提取代码的模型是:
jq6vz3qz5#
这个答案是为了澄清为了完成一个成功的CORS请求在后端需要什么。在本例中,您可以看到,如果
Authorization
头包含随请求沿着发送的Bearer
令牌,则只允许来自任何始发*
的OPTIONS和POST。关注fetchOptions
和defaultResponseHeaders
。服务器端:
创建一个简单的
if
条件来处理OPTIONS
http请求,该请求查询浏览器在您发出的每个请求时发送的CORS权限。客户端:
请注意
fetchOptions
中的mode: "cors"
。这指示浏览器向API端点发出OPTIONS
请求**,然后通过您在defaultResponseHeaders
中指定的Access-Control
CORS头告诉浏览器它将接受什么**。kqqjbcuj6#
只需复制以下代码并将其粘贴到
<system.webServer>
标记下的web.config文件中。