1.现象
在项目中WEB前端使用了ajax方式访问服务端的数据,一直访问的好好的代码,却突然不能执行success回调了,却执行了error回调,在确认了url是正常的,并直接在浏览器里访问url,也返回了正确的JSON数据的情况下,请教了高手帮我解决这个问题。@H_403_3@
@H_403_3@
CreateLogMapFromTmpl = function(tmplId) { url = "/service/welllogtmpl/" + tmplId; $.ajax({ type:'GET',url:url,cache:false,success:function(msg){ result = JSON.parse(msg); if(result.code == "200") { alert(result.response); } },error: function(e) { alert(e); } }); }
2.原因分析
在使用ajax访问数据的时候,浏览器会对返回值进行判断,其判断的依据就是请求头的ContentType,于是查看了服务端,有如下代码@H_403_3@
response.setContentType("text/javascript; charset=UTF-8");
也就是说服务端把返回内容指定成了javascript,那么浏览器就根据服务端指定的ContentType对页面返回信息进行判断,当然会认为返回了错误的信息,因为返回的内容是JSON,肯定不符合JavaScript的语法,于是就执行了error回调。
@H_403_3@
3.解决方案
经过分析,找到了原因,那么解决起来当然很容易了,只需要把服务端指定ContentType的代码去掉就行了,其默认类型是 text/plain ,就是告诉浏览器,返回的内容是普通的文本,就不用检查啦!!!@H_403_3@
@H_403_3@
4.如何直接返回JSON对象
很显然在客户端要使用JSON.parse来解析返回的普通文本,也是一项开销,那么有没有办法让浏览器直接返回JSON对象呢?答案是肯定的。@H_403_3@
只需要在服务端指定ContentType为json就行了,代码如下:@H_403_3@
response.setContentType("text/json; charset=UTF-8");
在客户端就不用再解析了,可以直接得到JSON对象,代码如下:
CreateLogMapFromTmpl = function(tmplId) { url = "/service/welllogtmpl/" + tmplId; $.ajax({ type:'GET',success:function(result){ //result = JSON.parse(msg); if(result.code == "200") { alert(result.response); } },error: function(e) { alert(e); } }); }
5.其他问题
在解决这个问题过程中,还发现了另一个文章,其问题主要是jquery版本对JSON的格式严格限制程度不一样造成的,但现象和本文中提到的现象一样。@H_403_3@
http://www.jb51.net/article/32540.htm @H_403_3@ 原文链接:https://www.f2er.com/ajax/164375.html