Cors fetch()带有跨域原因JSON.parse错误
我试图将fetch()用于跨域,但遇到了异常错误。我在Cors fetch()带有跨域原因JSON.parse错误,cors,fetch,Cors,Fetch,我试图将fetch()用于跨域,但遇到了异常错误。我在http://example2.com/index.html let url = "https://example1.com/login"; fetch(url, { "method":"POST", "content-type":"application/x-www-form-urlencoded", "mode":"no-cors", "headers":{
http://example2.com/index.html
let url = "https://example1.com/login";
fetch(url,
{
"method":"POST",
"content-type":"application/x-www-form-urlencoded",
"mode":"no-cors",
"headers":{
"Authorization":"Basic johnjohn",
"Auth-Secret":"johnsecretpassword",
}
})
.then(response=>response.text())
.then(content=>{
console.log(content); // prints empty line
json = JSON.parse(content);
})
.catch(e=>console.log(`Error occurred: ${e}`));
当我运行这个脚本时,我的console.log(content)
打印一个空行,我的JSON.parse(content)
给出一个错误:SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外的数据结尾错误
当我进入FireFox开发者控制台,单击网络,单击响应,我确实看到了以下负载:
将response.text()
更改为response.json()
会触发带有相同json解析错误的catch
块
还有,我的https://example1.com/login
是一个包含以下内容的php文件:
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Auth-Secret, Content-Type');
die(json_encode(array("data"=>"authorization","status"=>"fail")));
感谢@Amy在我上面的评论。这两项更改解决了问题:
我将这一行添加到我的login.php
:
header('Access-Control-Allow-Headers: Authorization, Auth-Secret, Content-Type');
我删除了我的index.html
中的行“mode”:“no cors”
这样,我的index.html
将尊重CORS,我的login.php
已准备好访问其他标题。您不能使用带有授权凭据的访问控制允许源代码:
。如果使用凭据,则必须显式指定域名。我尝试在PHP脚本和JavaScript fetch()中将授权重命名为Blah1
,将Auth Secret
重命名为Blah2
。但我还是犯了同样的错误。Blah1和Blah2不应该允许我绕过服务器端或客户端使用的任何默认授权过程吗?CORS不允许非标准头,除非您明确允许,但我认为它不会拒绝请求;它只会拒绝访问这些标题。请参阅关于CORS允许的标题。谢谢,我添加了标题('Access-Control-Allow-headers:Authorization,Auth Secret,Content Type')代码>到我的PHP脚本,但仍然是相同的问题。明天我得再研究一下。哦,当PHP脚本和javascript都使用SSL在同一顶级域时,问题就不存在了。我刚刚注意到您有“模式”:“无cors”,
。我想这应该是“cors”