使用Ajax解析数据遇到的问题
数据格式
我最近在使用JQuery的$.ajax访问后台的时候,发现竟然无法解析返回的数据,具体的错误记不清了(以后在遇到问题先截个图),可以在浏览器的Console中看到一个错误,但是去看这条请求是有数据返回的,所以刚开始我一直以为是Ajax写的不对,但是这个Ajax也并不是很复杂,实在搞不懂了。
还好这个url可以通过get方式访问,所以我当时直接在浏览器地址栏访问,发现是有数据返回的,但是这个数据的方式很奇怪,因为现在的浏览器都会对JSON数据进行格式化显示,但是这段数据的格式并非JSON的显示样式,反而是XML的方式显示的,这就奇怪了,明明说的都是通过JSON格式交互的,这是什么情况?我看后台代码之后发现他们使用的是@RestController (springMVC 的 org.springframework.web.bind.annotation.RestController)注解,而不是使用的@ResponseBody (使用RestController会告诉SpringMVC使用信息转换器,就可以不使用@ResponseBody注解,而是SpringMVC通过请求头的Accept属性判断,而有些时候这个值会是application/xml,所以会生成XML格式数据),我先没有修改这些后台代码,而是将JQuery中Ajax的dataType属性(dataType属性可以手动设置为json)指定为json,这些数据就可以正常被解析了。

唉,之后写Ajax还是可以加上dataType属性吧。后来,我修改后台代码,设置response的ContentType (使用response.setContentType(type))为application/json;charset=utf-8也是可以被前端正常解析的(哪怕不使用dataType)。
$.ajax({
url:'',
type:'get',
//设置Accept 预期服务器返回的数据类型
dataType:'json',
//contentType 可以指定发送给服务器的数据格式
contentType:'application/json;charset=utf-8',
data:{}
});
跨域问题
因为有些数据是需要访问其他的应用才可以获得的,所以就涉及到跨域的问题,处理跨域的问题有两种:
第一种:使用JSONP来处理跨域问题,只需要将dataType设置为jsonp即可(只支持GET方式的请求,因为其底层使用的的是js添加script标签,并设置script的src属性值,所以只能是GET方式)
$.ajax({
url: 'http://localhost:8080/testJsonp',
dataType: "jsonp",
success: function (data) {
console.log(data)
}
})
这种方式不用修改后台的代码,但是并不一定可以100%解决跨域问题,现象就是:请求响应都很正常(200),而且在浏览器调试工具中也有数据返回,就是拿不到数据,还会报一个数据格式不正确(是多一个还是少一个,号的问题)这个时候需要使用CORS方式。
如果数据量过大,使用GET方式就不太好了,因为URL长度有限制,这个时候也需要使用CORS方式
方法二:CORS,跨域资源共享。修改后台的代码,添加响应头
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS");
response.setHeader("Access-Control-Allow-Credentials", "true");
这种方式可以解决绝大部分跨域问题,但是就是需要修改后台代码
使用Ajax解析数据遇到的问题的更多相关文章
- Ajax--PHP+JQuery+Ajax解析json、XML数据、加载页面
一.JQuery+Ajax用get.post方式提交和请求数据 知识要点: $('#userName').blur(function () { var txt = $(this).val(); $.a ...
- ThinkPHP中ajax提交数据
最近在做项目时遇到了一些需要从页面用ajax提交数据到后台的操作,无奈本人技术有限,网上苦寻,研究了一下ajax和thinkPHP的结合,黄天不负苦心人,终于搞定了. 闲话少叙,进入正题:我需要从页面 ...
- 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...
- form表单提交数据,页面必定会刷新,ajax提交数据不会刷新,做到悄悄提交,多选删除,ajax提交实例
很多页面用到的模态对话框,如知明网站https://dig.chouti.com/的登录页都是模态对话框, 当点登录时,是用的ajax提交,因为输入错了信息,有返回消息,而页面没有刷新. jquery ...
- [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...
- 使用js接收ajax解析的json再拼成一个自己想要的json
//ajax解析的json{ "status": 1, "content": { "pathsInfo": [ { "id&quo ...
- h5-localStorage实现缓存ajax请求数据
使用背景:要实现每次鼠标hover“能力雷达”,则显示能力雷达图(通过ajax请求数据实现雷达图数据显示),所以每次hover都去请求ajax会影响性能,因此这里要用到本地缓存. 实现: 此处是通过传 ...
- Android之三种网络请求解析数据(最佳案例)
AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法. ...
- vue 中使用 AJAX获取数据的方法
在VUE开发时,数据可以使用jquery和vue-resource来获取数据.在获取数据时,一定需要给一个数据初始值. 看下例: <script type="text/javascri ...
随机推荐
- input 取消自动填充
增加属性: name="clear"
- 用servlet来提取数据,并作统计,然后用jfreechart画图
指定时间范围的数据提取,并做统计: 用servlet来提取数据,并作统计,然后用jfreechart画图. 使用的话,需要在web.xml里面配置相应的servlet,并且在index.jsp页面做引 ...
- MySQL 存储过程,游标,临时表创建
-- -------------------------------------------------------------------------------- -- Routine DDL - ...
- LARAVEL 路由原理分析
<?php class App { protected $routes = []; protected $responseStatus = '200 OK'; protecte ...
- Makefile总结
1.Makefile由目标(Target).依赖关系(Dependency).命令(Command)组成. (1)目标:可定义多个目标,默认指定第一个,make时可指定其中一个. (2)依赖关系:在同 ...
- FTRL笔记
这篇笔记主要参考冯杨的五篇博客:在线最优化求解(Online Optimization).因为对于在线学习方法,稀疏性问题需要特别关注:每次在线学习一个新 instance 的时候,优化方向并不一定是 ...
- 基于 od 窗口的anti
虽然 odadvance 这类的插件 , 使用驱动将 od 的窗口 进行 隐藏,使用enumwindow ,无法枚举到od的窗口, 但是依然可以 使用r3 的方法 , 对od 窗口检测 之后可以使用 ...
- 看到就是赚到!Selenium完整框架——告别2017
这个框架大家可以拿过去直接用——作为送给大家的元旦礼物——船长对你们简直太好了! 学了这么长时间,又是定位,又是发邮件,还有乱七八糟的unittest,现在时候后把东西用起来了~而且学会了这一篇你就可 ...
- Java中16进制与字符串之间的相互转换
笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...
- {Reship}{Sparse Representation}稀疏表示
===================================================== http://blog.sina.com.cn/s/blog_6d0e97bb01015wo ...