理解json和jsonp的定义和区别以及如何实际使用
(一)什么是跨域请求?
首先要理解什么是跨域?
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。
其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。
常见跨域场景:(JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。)

常见解决跨域办法:
①代理:使用php做代理文件,ajax直接请求php文件
②通过设置响应头
③通过jsonp,通过某些标签(img,script,iframe )src属性
(二)json和jsonp的定义和区别
区别:
json是一种基于文本的数据交换格式(无法跨域),jsonp是一种非官方跨域数据交互协议。json返回的是一串数据,而 jsonp返回的是脚本代码(包含一个函数调用)。
定义:
json可以理解为是一种格式,它的键必须用双引号。json格式的对象必须写在{}花括号里面,json格式的数组写在[]大括号里面。
jsonp实现跨域的原理:
1.首先在客户端注册一个callback, 然后把callback的名字传给服务器。
2.服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp. 最后将 json 数据直接以入参
的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
3.客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)
(三)使用demo示例
script标签jsonp跨域具体实现
(1)script标签实现跨域
客户端html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>script标签与jsonp</title>
<script>
var script = document.createElement('script');
script.type = 'text/javascript';
//传参并指定回调执行函数为jsonpBack
script.src = 'http://dev.test.com/jsonp.php?callback=jsonpBack';
//script标签追加到head标签中
document.head.appendChild(script); //回调执行函数
function jsonpBack(data) {
alert(JSON.stringify(data));
}
</script>
</head>
<body>
</body>
</html>
服务端php.代码
<?php
$a = $_GET['callback'];//接收参数,名为js函数名
$data = array('name'=>'admin','age'=>100);
$json = json_encode($data);
echo "$a($json)";//服务端输出,可执行的js函数名称
打印结果如下图:

注意:由于浏览器的同源策略,禁止ajax从一个域名请求另外一个域名上面的数据.
(2)ajax获取json数据
客户端html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax获取json</title>
</head>
<body>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
</script>
<script type="text/javascript">
$.ajax({
type : 'get',
url : 'http://dev.php.com/test3/json.php',
dataType : 'json',
success : function(data) {
alert('ajax获取json数据:' +JSON.stringify(data));
}
});
</script>
</body>
</html>
服务端php.代码
<?php
$data = array("name"=>"admin","age"=>"100");
$json = json_encode($data);
echo $json;
打印结果如下图:

ajax中jsonp跨域具体实现
(3)ajax中jsonp使用
客户端html代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ajax中jsonp</title>
</head>
<body>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({
type: "get",
url: "http://dev.test.com/jsonp.php",
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:"jsonpBack",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(data){
alert('ajax中jsonp回调:' +JSON.stringify(data));
},
error: function(){
alert('fail');
}
});
</script>
</body>
</html>
服务端php.代码
<?php
$a = $_GET['callback'];//接收参数,名为js函数名
$data = array('name'=>'admin','age'=>100);
$json = json_encode($data);
echo "$a($json)";//服务端输出,可执行的js函数名称
打印结果如下图:

理解json和jsonp的定义和区别以及如何实际使用的更多相关文章
- json、jsonp的定义和区别
一.区别 简单来说,json是一种数据交换格式,jsonp是一种非官方跨域数据交互协议.json描述的是信息的格式,而jsonp是信息传递双方约定的方法.json返回的是一串数据,而 jsonp返回的 ...
- JSON、JSONP、XML的区别
这两天看jquery手册的时候看到了jsonp.发现手册把jsonp与json放在一起讲解了,所以想写篇文章 梳理一下这三者的关系. jsonp: jsonp是json的一种“使用模式”,可以让网页从 ...
- JSON、JSONP、Ajax的区别
什么是JSON JSON是一种基于文本的数据交换方式,或者叫做数据描述格式. JSON的优点: 1.基于纯文本,跨平台传递极其简单: 2.Javascript原生支持,后台语言几乎全部支持: 3.轻量 ...
- 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区别浅析(json才是目的,jsonp只是手段)
一言以蔽之,json返回的是一串数据:而jsonp返回的是脚本代码(包含一个函数调用): JSON其实就是JavaScript中的一个对象,跟var obj={}在质上完全一样,只是在量上可以无限扩展 ...
- json和jsonp的区别(转)
原文链接:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 说到AJAX就会不可避免的面临 ...
随机推荐
- SoapUI常用的参数化方法
本篇文章来讲一下SoapUI在使用中常用的参数化方法字段参数化和使用DataSource调用Excel中的 数据给接口参数化,其中DataSource功能SoapUI开源版没有,大家可以使用破解版, ...
- 安装mysql8.0.17时候报错1251-Client does not support authentication protocol requested by server; consider upgrading MySQL client
当mysql数据库安装时候选择的是加密密码时候,用navicat连接时候报错1521,这时候可以cmd之后登陆mysql执行下列代码就可以了 代码: mysql> alter user root ...
- (136)leetcode刷题Python笔记——只出现一次的数字
题目如下: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- SpringBoot使用webservice
Pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- iBatis框架之配置文件之注意点之总结
1.配置文件sqlMap.xml中需要注意的点 比如: <?xml version="1.0" encoding="UTF-8" ?> <!D ...
- Linux 与 Unix 到底有啥区别和联系?
原文:https://opensource.com/article/18/5/differences-between-linux-and-unix 来源:开源中国社区,译者:Tocy, LinuxTe ...
- Codeforces 1159E Permutation recovery(构造+拓扑)
这道题其实只要解决了什么时候输出 -1 ,那么此题的构造方法也就解决了.首先我们可以观察这组 3 3 4 和 3 4 4 ,可以算出第二组是不成立的,在观察一组 2 3 4 5 和 3 2 4 5 ...
- BitMap的原理和实现
相关概念 基础类型 在java中: byte -> 8 bits -->1字节 char -> 16 bit -->2字节 short -> 16 bits --> ...
- python学习第四十二天列表生成式用法及作用
在操作列表或者元组的时候,对一系列的数据进行算法,比较整个数据加1,或翻倍,用传统的算法就很繁琐,列表给我们提供简便的方法 a=[i*i for i in rang(10)] a=[1,4,9,16, ...
- TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
把这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数 ...