ajax与php和JSONP的关系,Jquery ajax实现跨域请求之json与jsonp本质区别

JSON 介绍

1、什么是 JSON?

> JSON 指的是 JavaScript 对象表示法 (JavaScript Object Notation)

> JSON 是一种轻量级的数据交换格式,比 XML 更小、更快、更易解析

> JSON 独立于语言的文本格式

> JSON 易于人阅读和编写,同时也易于机器解析和生成

JSON 最初来自于 JavaScript,后来被所有的编程语言支持,成为了一种通用的字符串数据格式。

2、JSON 字符串的格式

2-1、“名称/值”对的集合,一般理解为对象。例如:

'{"uid":101, "uname":"Roger", "isMarried":true}'

2-2、值的有序列表,一般理解为数组。例如:

'[10,20,true,"Roger",{},[] ]'

JSON 格式示例如下:

示例一:

示例二:

bcbcafde71783c48617922a829bb572f.png

3、JSON 具有以下这些形式

3-1、JSON 字符串 要么是  一个{ },要么是一个 [ ]

0082d40d2c6159a809caded2c4056c3e.png

8954ebcd6f8363c77e88fb0d378a4dc2.png

3-2、JSON 中所有的 string 必须使用 "", 包括 key。使用反斜线转义,如:\", \\, \b

469e13bffbb06fd1d70e0df44ccb0f3c.png

3-3、JSON 对象的 value 只能是 string、number、object、array、true、false、null,不存在 Date 等类型

f565dc0beba41d6bb0edcc6a323b5e1c.png

4、JS 与 JSON 互转

JSON 字符串  => JS 对象/数组:  var obj = JSON.parse( str );

JS 对象/数组  => JSON 字符串:  var str = JSON.stringify( obj );

示例代码一:(JSON 转 JS 对象)

结果:

8fdbe2ca6462a138a92846dfb3ba2293.png

示例代码二:(JS 转 JSON 字符串)

结果:

701da27fbea9f47738d06ce35ee8c51a.png

5、PHP 与 JSON 互转

PHP 数组  => JSON 字符串:$str = json_encode( $arr );

JSON 字符串  => PHP数组: $arr = json_decode( $str );

示例代码一:(PHP数组 转 JSON字符串)

结果:

d542b9a682050e131411e49b279ab8db.png

示例代码二:(JSON字符串 转 PHP数组)

1

2

3

4

5

6

header('Content-Type: application/json');

$str ='{"a":"apple","b":"banana","c":"cherry","d":"duria"}';

var_dump( json_decode($str) );

结果:

f019a6ddea39985547d181d21e93ab5c.png

JSONP 介绍

1、什么是 JSONP?

JSON with Padding:填充式 JSON,是 JSON 的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

我们知道 img、a、link 和 script 都是允许跨域的,JSONP的原理就是利用了这一点

2、JSONP的原理

在客户端动态的创建一个 script 标签,代替 XHR 对象,指定 script.src 向服务器发起请求,请求的PHP页面除了返回需要的数据外,还需要填充一个指定的函数名。

1

2

3

header('Content-Type: application/javascript');

$json = json_encode($data);

echo $cb .'(' .$json .')';

我们可以模拟一下前面的文字描述

新建一个HTML 页面

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

html>

发起跨域请求

//回调函数

function doResponse(obj){

console.log(obj.uname + obj.age);

};

var btn = document.getElementById('btn');

//点击按钮发起跨域请求

btn.onclick = function(){

//动态创建一个 script 标签

var s = document.createElement('script');

//指定一个 script.src 向服务器发起请求

s.src = "http://127.0.0.1:8081/Ajax/4.php?callback=doResponse";

document.body.appendChild(s);

};

新建一个PHP页面

看一眼这个PHP页面返回的内容,记住要在域名后面加一个callback 参数

48d571a7b4cb6f1ac6142488f020f087.png

点击按钮以后,控制台可以看到,动态生成了一个 script 标签

69ebdd102cab9b245094b76762388e55.png

打开 Network,可以看到这个实际发起的是一个 script 请求,而且响应消息是一段 JSON字符串

5a956afcb9c52e31bc76885bc331af3d.png

响应消息

e4efefa8c48db3c6d5eaa7e0b3534de7.png

查看输出内容,成功拿到了数据

308a0ed33357fe1032b453088c5c64df.png

3、jQuery 封装的 JSONP

$.getJSON('http://其它域名/xx.php?callback=?', fn)

HTML页面

点击按钮,发起跨域请求,成功的拿到了响应数据

b6691d3504c785e2031ee24f72aa9b30.png

HTML 页面

同样也成功拿到了数据,效果截图同上

3e470efb9a77b2ace9cff8e44308f673.png

7f56687861018e430c04028ec4494da2.png

本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1878395,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值