json和jsonp的使用区别
json和jsonp的使用区别
一. 跨域请求的概念
JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。

二. json和jsonp
JSON是一种基于文本的数据交换方式(不支持跨域),而JSONP是一种非官方跨域数据交互协议。
使用json格式传递数据的客户端代码如下:
$(function () {
var user = {
"username": "HelloWorld"
};
$.ajax({
url: "http://localhost:8080/Changyou/UserInfo",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json", //json不支持跨域请求,只能使用jsonp
data: {
user: JSON.stringify(user)
},
success: function (data) {
$("#user_name")[0].innerHTML = data.user_name;
$("#user_teleNum")[0].innerHTML = data.user_teleNum;
$("#user_ID")[0].innerHTML = data.user_ID;
},
error: function () {
alert("请求超时错误!");
}
})
});
然而,简单地使用json并不能支持跨域资源请求,为了解决这个问题,需要采用jsonp数据交互协议。众所周知,js文件的调用不受跨域与否的限制,因此如果想通过纯web端跨域访问数据,只能在远程服务器上设法将json数据封装进js格式的文件中,供客户端调用和进一步处理,这就是jsonp协议的原理。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
简单的说,就是json不支持跨域,而js可以跨域,因此在服务器端用客户端提供的js函数名将json数据封装起来,再将函数提供给客户端调用,从而获得json数据。
开发过程中,如果出现类似 “Origin ****** is not allowed by Access-Control-Allow-Origin.” 的错误,则可能是由于json数据不支持跨域导致的,应考虑使用jsonp协议。
如果出现类似 ”SyntaxError: Unexpected token ':'. Parse error.“ 的错误,则可能是由于返回的json数据没有用”callback“传递的函数名封装导致的。
客户端代码如下:
$(function () {
var user = {
"username": "HelloWorld"
};
$.ajax({
url: "http://localhost:8080/Changyou/UserInfo",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "jsonp", //json不支持跨域请求,只能使用jsonp
data: {
user: JSON.stringify(user)
},
jsonp: "callback", //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名,默认为callback
jsonpCallback: "userHandler", //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function (data) {
$("#user_name")[0].innerHTML = data.user_name;
$("#user_teleNum")[0].innerHTML = data.user_teleNum;
$("#user_ID")[0].innerHTML = data.user_ID;
},
error: function () {
alert("请求超时错误!");
}
})
});
服务器端代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json; charset=utf-8");
String username = new String(request.getParameter("user").getBytes("ISO-8859-1"),"utf-8");
String callback = new String(request.getParameter("callback").getBytes("ISO-8859-1"),"utf-8");
System.out.println("接收到的数据:" + username);
System.out.println("callback的值:" + callback);
JSONObject user = JSONObject.fromObject(username);
System.out.println("接收到的用户名:" + user.get("username"));
JSONObject userinfo = new JSONObject();
userinfo.put("user_name", "张鸣晓");
userinfo.put("user_teleNum", "18810011111");
userinfo.put("user_ID", "123456789098765432");
PrintWriter out = response.getWriter();
String backInfo = callback + "(" + userinfo.toString() + ")"; //将json数据封装在callback函数中提供给客户端
out.print(backInfo);
out.close();
}
尽管客户端没有实现userHandler函数,但也能成功运行,原因就是jquery在处理jsonp类型的ajax时,自动帮你生成回调函数并把数据取出来供success属性方法来调用。
更详细解释,参见http://kb.cnblogs.com/page/139725/
json和jsonp的使用区别的更多相关文章
- json 与jsonp 特点及区别
简单描述JSON跟JSONP的区别以及实战 什么是JSON? 前面简单说了一下,JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,你是否该选用他首先肯定要关注它所拥有的优点. JSON的优点 ...
- JSON和JSONP有哪些区别,PhoneGap跨域请求如何实现
前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...
- json和jsonp的区别,ajax和jsonp的区别
json和jsonp虽然只有一个字母的区别,但是它们之间扯不上关系. json是一种轻量级的数据交换格式. jsonp是一种跨域数据交互协议. json的优点:(1)基于纯文本传递极其简单,(2)轻量 ...
- json与jsonp区别浅析(json才是目的,jsonp只是手段)
一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展 ...
- json与jsonp区别浅析(json才是目的,jsonp只是手段) (转)
一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展 ...
- JSON跟JSONP的区别以及实战
前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...
- JSON和JSONP的区别,以及使用方法
(一)场景 在拉京东城市选择的基础数据时候,遇到被服务器拒绝的情况,也就是ajax跨域问题 (二)json和jsonp 说的直白一点,在我们做ajax异步的一些功能的时候,一定会或多或少的遇到两个问题 ...
- 小渣渣的json和jsonp和ajax的实质和区别
json和jsonp和ajax的实质和区别ajax的两个问题 1.ajax以何种格式来交换数据 2.跨域的需求如何解决 数据跨域用自定义字符串或者用XML来描述 跨域可以用服务器代理来解决jsonp来 ...
- Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
为什么要用jsonp? 相信大家对跨域一定不陌生,对同源策略也同样熟悉.什么,你没听过?没关系,既然是深入浅出,那就从头说起. 假如我写了个index页面,页面里有个请求,请求的是一个json数据(不 ...
随机推荐
- SOC四大弱点分析
导读 今年的年度安全运营中心(SOC)调查中,SANS研究所指出了4个最为常见的SOC弱点.这些弱点的根源可被追溯到我们非常熟悉的人.过程.适度规划和技术实现上.下面我们就来看看SOC的四大弱点究竟是 ...
- MVC 4 图片的上传及显示
1 首先我们看一下如何上传 1.1 view 上传页面: 1: @using (Html.BeginForm("Create", "Achievement", ...
- formelf.exe的用法
@2018-9-17 在windows下的cmd.exe程序下生成某个文件的 .txt版本 fromelf --text -o name.txt target.x
- 一种使用emwin库函数导致hardfault的情况
@2018-08-27 使用函数 WM_SendMessageNoPara(hWin_MainTask, WM_INIT_DIALOG),调试至此处进入hardfault,经查是由于hWin_Main ...
- 【洛谷P1972】HH的项链 离线+树状数组
题目大意:静态查询序列区间颜色数. 题解:对于一个查询区间 [l , r] ,若有两个相同颜色的点在这个区间中,则总是取下标靠近端点 r 的颜色计入答案贡献.对于每个下标,记录下在这个下标之前,且距离 ...
- MATLAB:图像乘除法运算(immultiply、imdivide函数),同时比较双精度类型图像运算结果
图像乘除法运算涉及到immultiply.imdivide函数,实现代码如下: 1.图像之间的乘法运算 close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear ...
- 鼠标监听事件MouseListener
public class Demo extends JFrame { private JTextArea textArea; public Demo() { setBounds(100, 100, 4 ...
- 多行文本文本输入框 textarea 可点击任意地方编辑的问题
遇到了一个问题: textarea可以点击任意地方编辑 原因: textarea中间我换行了 改成: 就正常了.
- Spring(2)
前言:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依 ...
- ARP协议原理学习
一.ARP的作用. 首先在window 的命令行中输入arp -a即可查看本机的arp缓存表.主机要发送数据包时,需要填充目的IP及其IP地址对应的MAC.当我们只有目的IP地址时,如何得到其对应的M ...