Javascript 无法使用Fetch API获取JSON,但可以使用JQuery
我正在将React项目集成到Grails/Angular系统中,并尝试使用React的FetchAPI查询Grails 在应用程序运行且Chrome developer tools控制台打开的情况下,以下各项按预期工作:Javascript 无法使用Fetch API获取JSON,但可以使用JQuery,javascript,jquery,grails,fetch-api,Javascript,Jquery,Grails,Fetch Api,我正在将React项目集成到Grails/Angular系统中,并尝试使用React的FetchAPI查询Grails 在应用程序运行且Chrome developer tools控制台打开的情况下,以下各项按预期工作: $.get('/project/controller/get', function(data, status) { console.log(data); }); fetch('/project/controller/get', { credentials: 'i
$.get('/project/controller/get', function(data, status) {
console.log(data);
});
fetch('/project/controller/get', {
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(response => console.log(response))
.catch(error => console.log(error))
它显示一组JSON,如下所示:
以下操作未按预期工作:
$.get('/project/controller/get', function(data, status) {
console.log(data);
});
fetch('/project/controller/get', {
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(response => console.log(response))
.catch(error => console.log(error))
它给出了一个语法错误,因为它试图将HTML文档解析为JSON
在developer tools network选项卡中,我看到当我发出JQuery请求时,只有一个GET请求,服务器响应就是我想要的JSON
当我使用Fetch API发出请求时,会出现两个请求:
- 一个是/project/controller/get,它只响应状态代码302,没有JSON
- 另一个to/project,响应状态代码为200,应用程序首页为HTML。这是FetchAPI接收并尝试解析为JSON的内容
我刚刚注意到,出于某种原因,进入浏览器会自动将我重定向到。可能是服务器做了一些奇怪的事情,但奇怪的是JQuery请求工作正常 它给出了一个语法错误,因为它试图解析HTML文档 作为JSON
如果响应是HTML,请使用
response.text()
302是重定向,因此您的获取请求将重定向到另一个页面,可能是登录页面(?)
我在您的获取请求中看到您正在使用凭据:'include'
,可能这包括授权标头或类似的内容,并且您的控制器拒绝了该请求
使用chrome Developer console,如果在网络选项卡上标记“保留日志”,则可以检查请求。
内容类型
标头用于指定请求正文的数据类型。因为您正在发出get请求,所以不需要它。尝试删除它。“它给出了一个语法错误,因为它试图将HTML文档解析为JSON。”您可以创建一个JSFIDLE或plnkr来演示吗?请参阅代码是否用于为Ajax请求设置默认值?无论如何,对于您的获取请求,您是否尝试过使用头:{'Accept':'application/json'}
或其他变体?(也就是说,为GET请求设置一个Accept头,而不是为其设置内容类型——正如前面的注释所述,这不会产生任何效果。)当您在浏览器devtools中查看请求时,jQuery$.GET
调用正在发送,它发送的是什么Accept头?另外,jquery示例正在查询与fetch示例不同的url:将头更改为头:{'Accept':'application/json'}
不会影响它。它仍然返回HTML。是的,但问题是如何让它返回JSON,如果通过jQuery$查询时相同的URL确实返回JSON。get()
@nnnn“如果通过jQuery$查询时相同的URL确实返回JSON。get()
”我们如何确定“应用程序/JSON”
是否提供了服务?如果响应是有效的JSON
,OP为什么会提到HTML文档?问题明确地说,对同一URL的请求会产生不同的响应,这取决于它们是使用$.get()
还是fetch()
。他们还可以在console网络选项卡中看到不同的行为。这就是问题的关键所在。@nnnnnnnn不,这不是问题的关键所在。OP在问题文本中明确提到一个HTML文档
。HTML文档如何与JSON相关?OP需要重现有效的JSON
在Response.JSON()调用时抛出错误。啊,是的。微妙但重要。