Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以用通俗的话来解释JSONP是什么吗?

可以用通俗的话来解释JSONP是什么吗?

提问于 2017-12-25 08:23:31
回答 2关注 0查看 875

我知道JSONP是JSON填充。

我明白JSON是什么,以及如何使用它jQuery.getJSON()。但是,我不明白callback什么时候引入JSONP 的概念。

谁可以向我解释这是如何工作的?

回答 2

以往V

发布于 2017-12-25 08:51:49

假设服务端有数据 "foobar" 需要传给客户端。在客户端定义如下函数用来对数据进行打印、警告等操作:function print(e){

代码语言:txt
AI代码解释
复制
  console.log(e)
代码语言:txt
AI代码解释
复制
}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
function warn(e){
代码语言:txt
AI代码解释
复制
  alert(e)
代码语言:txt
AI代码解释
复制
}

假如说服务端用来获取数据的URL是:http://server.com/jsonp.php

然后我使用 <script> 标签或者 jQuery 发起如下请求:http://server.com/jsonp.php?callback=print

当这个 php 页面检测到 callback 参数(随便叫啥都行)的值时,会把要发给客户端的数据包裹在 print 的函数调用里,变成这种样子返回给客户端:print("foobar");

这样对这个请求的结果就是一个函数调用,于是 "foobar" 会被打印出来。当我想弹出对话框时,只需要把 callback 的值换成 warn 就行了。这个过程就是 jsonp。

秋之夕颜清

发布于 2017-12-25 08:51:25

什么是JSONP

首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中。JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进行数据的传输。

那么JSONP是什么呢?

首先抛出浏览器同源策略这个概念,为了保证用户访问的安全,现代浏览器使用了同源策略,即不允许访问非同源的页面,详细的概念大家可以自行百度。这里大家只要知道,在ajax中,不允许请求非同源的URL就可以了,比如www.a.com下的一个页面,其中的ajax请求是不允许访问www.b.com/c.php这样一个页面的。

JSONP就是用来解决跨域请求问题的,那么具体是怎么实现的呢?

JSONP原理

ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

JSONP具体实现

1.首先看下ajax中如果进行跨域请求会如何。

前端代码在域www.practice.com下面,使用ajax发送了一个跨域的get请求

代码语言:txt
AI代码解释
复制
<!DOCTYPE html>
代码语言:txt
AI代码解释
复制
<html>
代码语言:txt
AI代码解释
复制
<head>
代码语言:txt
AI代码解释
复制
    <title>GoJSONP</title>
代码语言:txt
AI代码解释
复制
</head>
代码语言:txt
AI代码解释
复制
<body>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    function jsonhandle(data){
代码语言:txt
AI代码解释
复制
        alert("age:" + data.age + "name:" + data.name);
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript" src="jquery-1.8.3.min.js">
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    $(document).ready(function(){
代码语言:txt
AI代码解释
复制
        $.ajax({
代码语言:txt
AI代码解释
复制
            type : "get",
代码语言:txt
AI代码解释
复制
            async: false,
代码语言:txt
AI代码解释
复制
            url : "http://www.practice-zhao.com/student.php?id=1",
代码语言:txt
AI代码解释
复制
            type: "json",
代码语言:txt
AI代码解释
复制
            success : function(data) {
代码语言:txt
AI代码解释
复制
                jsonhandle(data);
代码语言:txt
AI代码解释
复制
            }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        });
代码语言:txt
AI代码解释
复制
    });
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
</body>
代码语言:txt
AI代码解释
复制
</html>

后端PHP代码放在域www.practice-zhao.com下,简单的输出一段json格式的数据

代码语言:txt
AI代码解释
复制
jsonhandle({
代码语言:txt
AI代码解释
复制
    "age" : 15,
代码语言:txt
AI代码解释
复制
    "name": "John",
代码语言:txt
AI代码解释
复制
})

2.下面使用JSONP,将前端代码中的ajax请求去掉,添加了一个script标签,标签的src指向了另一个域www.practice-zhao.com下的remote.js脚本

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
<!DOCTYPE html>
代码语言:txt
AI代码解释
复制
<html>
代码语言:txt
AI代码解释
复制
<head>
代码语言:txt
AI代码解释
复制
    <title>GoJSONP</title>
代码语言:txt
AI代码解释
复制
</head>
代码语言:txt
AI代码解释
复制
<body>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    function jsonhandle(data){
代码语言:txt
AI代码解释
复制
        alert("age:" + data.age + "name:" + data.name);
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript" src="jquery-1.8.3.min.js">
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript" src="http://www.practice-zhao.com/remote.js"></script>
代码语言:txt
AI代码解释
复制
</body>
代码语言:txt
AI代码解释
复制
</html>

这里调用了跨域的remote.js脚本,remote.js代码如下:

代码语言:txt
AI代码解释
复制
jsonhandle({
代码语言:txt
AI代码解释
复制
    "age" : 15,
代码语言:txt
AI代码解释
复制
    "name": "John",
代码语言:txt
AI代码解释
复制
})

也就是这段远程的js代码执行了上面定义的函数,弹出了提示框

3.将前端代码再进行修改,代码如下:

代码语言:txt
AI代码解释
复制
<!DOCTYPE html>
代码语言:txt
AI代码解释
复制
<html>
代码语言:txt
AI代码解释
复制
<head>
代码语言:txt
AI代码解释
复制
    <title>GoJSONP</title>
代码语言:txt
AI代码解释
复制
</head>
代码语言:txt
AI代码解释
复制
<body>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    function jsonhandle(data){
代码语言:txt
AI代码解释
复制
        alert("age:" + data.age + "name:" + data.name);
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript" src="jquery-1.8.3.min.js">
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    $(document).ready(function(){
代码语言:txt
AI代码解释
复制
        var url = "http://www.practice-zhao.com/student.php?id=1&callback=jsonhandle";
代码语言:txt
AI代码解释
复制
        var obj = $('<script><\/script>');
代码语言:txt
AI代码解释
复制
        obj.attr("src",url);
代码语言:txt
AI代码解释
复制
        $("body").append(obj);
代码语言:txt
AI代码解释
复制
    });
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
</body>
代码语言:txt
AI代码解释
复制
</html>

这里动态的添加了一个script标签,src指向跨域的一个php脚本,并且将上面的js函数名作为callback参数传入,那么我们看下PHP代码怎么写的:

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
<?php
代码语言:txt
AI代码解释
复制
$data = array(
代码语言:txt
AI代码解释
复制
    'age' => 20,
代码语言:txt
AI代码解释
复制
    'name' => '张三',
代码语言:txt
AI代码解释
复制
);
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
$callback = $_GET['callback'];
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
echo $callback."(".json_encode($data).")";
代码语言:txt
AI代码解释
复制
return;

PHP代码返回了一段JS语句,即

代码语言:txt
AI代码解释
复制
jsonhandle({
代码语言:txt
AI代码解释
复制
    "age" : 15,
代码语言:txt
AI代码解释
复制
    "name": "张三",

此时访问页面时,动态添加了一个script标签,src指向PHP脚本,执行返回的JS代码,成功弹出提示框。

所以JSONP将访问跨域请求变成了执行远程JS代码,服务端不再返回JSON格式的数据,而是返回了一段将JSON数据作为传入参数的函数执行代码。

4.最后jQuery提供了方便使用JSONP的方式,代码如下:

代码语言:txt
AI代码解释
复制
<!DOCTYPE html>
代码语言:txt
AI代码解释
复制
<html>
代码语言:txt
AI代码解释
复制
<head>
代码语言:txt
AI代码解释
复制
    <title>GoJSONP</title>
代码语言:txt
AI代码解释
复制
</head>
代码语言:txt
AI代码解释
复制
<body>
代码语言:txt
AI代码解释
复制
<script type="text/javascript" src="jquery-1.8.3.min.js">
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
<script type="text/javascript">
代码语言:txt
AI代码解释
复制
    $(document).ready(function(){
代码语言:txt
AI代码解释
复制
        $.ajax({
代码语言:txt
AI代码解释
复制
            type : "get",
代码语言:txt
AI代码解释
复制
            async: false,
代码语言:txt
AI代码解释
复制
            url : "http://www.practice-zhao.com/student.php?id=1",
代码语言:txt
AI代码解释
复制
            dataType: "jsonp",
代码语言:txt
AI代码解释
复制
            jsonp:"callback", //请求php的参数名
代码语言:txt
AI代码解释
复制
            jsonpCallback: "jsonhandle",//要执行的回调函数
代码语言:txt
AI代码解释
复制
            success : function(data) {
代码语言:txt
AI代码解释
复制
                alert("age:" + data.age + "name:" + data.name);
代码语言:txt
AI代码解释
复制
            }
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        });
代码语言:txt
AI代码解释
复制
    });
代码语言:txt
AI代码解释
复制
</script>
代码语言:txt
AI代码解释
复制
</body>
代码语言:txt
AI代码解释
复制
</html>
和开发者交流更多问题细节吧,去 写回答
相关文章
Python中 __init__的通俗解释是什么?
可能大家常常会在面向对象编程中看到__init__,而且几乎每个类中都会有,它的作用都是是什么呢?
派大星的数据屋
2022/04/03
6890
Python中 __init__的通俗解释是什么?
iOS越狱是什么?大佬来解释来咯(一)
那么root是什么呢,无论安卓和iOS都有两个用户,一个是root,另一个是mobile,前者相当于windowns的system,也就是管理员administrator,后者相当于一个非管理员用户,没有拥有系统管理权限,通过一些特殊手段,例如第三方root工具,这里我就不详细说了,因为我接触安卓不多,不再赘述。
zby1101
2020/08/05
1.1K0
iOS越狱是什么?大佬来解释来咯(二)
众所周知,越狱可以获取最高权限,而在iOS上访问系统根目录是需要最高系统权限的(虽然也有不需要越狱获取文件系统的实例)
zby1101
2020/08/05
1.1K0
iOS越狱是什么?大佬来解释来咯(二)
TCP为什么需要三次握手?用最通俗的话解释给你听
TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?读者可以带着疑问,看一遍本篇博客的详细讲解
杰哥的IT之旅
2021/09/27
7900
通俗解释hash碰撞是什么以及如何解决
这里的学号是个key,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是下标值,用来确定这个Entry要存放在哈希表中哪个位置。
全栈程序员站长
2022/07/04
3490
通俗解释hash碰撞是什么以及如何解决
为什么要用到Nginx来做负载均衡?通俗的解释
如果我们写好的网站只放在一台服务器上,访问量一大或者停电了,导致服务器挂了,我们的网站就访问不了了!像电商网站要是在电商节日挂了,那等着被请喝茶吧~哈哈哈
MonroeCode
2021/12/28
7300
为什么要用到Nginx来做负载均衡?通俗的解释
用通俗的语言解释下:Spark 中的 RDD 是什么
RDD,学名可伸缩的分布式数据集(Resilient Distributed Dataset)。初次听闻,感觉很高深莫测。待理解其本质,却发现异常简洁优雅。本文试图对其进行一个快速侧写,试图将这种大数据处理中化繁为简的美感呈现给你。
木鸟杂记
2022/12/07
5900
用通俗的语言解释下:Spark 中的 RDD 是什么
11-通俗解释keystone
如果把CTF比赛比作Project,参赛的选手就是User,CTF比赛可以提供交流学习、测评技能、学校之间交流合作等多种服务(Service);
小朋友呢
2019/12/28
8620
通俗解释随机森林算法
首先我们来复习一下之前介绍过的两个机器学习模型:Bagging和Decision Tree。Bagging是通过bootstrap的方式,从原始的数据集D中得到新的D^;然后再使用一些base algorithm对每个D^都得到相应的gt;最后将所有的gt通过投票uniform的形式组合成一个G,G即为我们最终得到的模型。Decision Tree是通过递归形式,利用分支条件,将原始数据集D切割成一个个子树结构,长成一棵完整的树形结构。Decision Tree最终得到的G(x)是由相应的分支条件b(x)和分支树Gc(x)递归组成。
红色石头
2022/01/12
3700
通俗解释随机森林算法
通俗解释"神经网络"
当下互联网圈最火的要数"人工智能"了,而人工智能是基于神经网络的,这里简单描述一下"神经网络" 人的神经元 人的神经元 简化版神经元 简化版 上图中的圆圈表示一个"感知器",它可以接受多个输入,产出
zhaoolee
2018/04/19
1.2K0
通俗解释"神经网络"
如何通俗地解释多云
什么是多云?它与混合云有何不同?多云有哪些用例和安全问题?人们讨论多云策略需要通俗易懂的方法。
CloudBest
2019/10/23
8470
如何通俗地解释多云
Build/Host/Target 通俗易懂 的 解释
According to the GNU convention, there are three platforms involved in the software building:
望天
2019/08/29
1.4K0
通俗易懂的HTTPS解释
我们在网络的行为(例如看文章、购物、上传图片),简单来说都是向服务器发送消息、接收服务器的消息,这个过程很像信鸽传书。
dys
2018/12/14
1.4K1
事件监听机制的通俗解释
事件监听机制: A:事件源   事件发生的地方 B:事件      要发生的事情 C:事件处理    针对发生的事情做出的处理方案 D:事件监听    把事件源和事件关联起来 举例:人受伤事件。 事件源:人(具体的对象) Person p1 = new Person("张三"); Person p2 = new Person("李四"); 事件:受伤 interface 受伤 {
黑泽君
2018/10/11
8740
通俗的解释什么是Promise
MDN的解释: Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象。
全栈程序员站长
2022/08/31
9500
通俗的解释什么是Promise
Github上各种名词通俗解释
有一个仓库(repository),叫Repo A。你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Github账号下有了一个Repo A2,。然后你在这个A2下工作,Commit,push等。然后你希望原始仓库Repo A合并你的工作,你可以在Github上发起一个Pull Request,意思是请求Repo A的所有者从你的A2合并分支。如果被审核通过并正式合并,这样你就为项目A做贡献了。
Jean
2019/04/11
1.3K0
Github上各种名词通俗解释
小波变换通俗解释版
从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路。 下面就按照傅里叶-->短时傅里叶变换-->小波变换的顺序,讲一下为什么会出现小波这个东西、小波究竟是怎样的思路。 一、傅里叶变换 关于傅里叶变换的基本概念在此我就不再赘述了,默认大家现在正处在理解了傅里叶但还没理解小波的道路上。 下面我们主要将傅里叶变换的不足。即我们知道傅里叶变化可以分析信号的频谱,那么为什么还要提出小波变换?答案“对非平稳
智能算法
2018/04/03
1.7K0
小波变换通俗解释版
闪电网络原理通俗解释
第章 引言 今天有人宣布BTC上的闪电网络可以使用了,甚至今天价格也突然涨了1000美元(有没有因果关系不知道),可闪电网络到底是啥,真的可以用了吗? 闪电网络的原理实在是太过于复杂,白皮书打印出来,28张A4纸,我一字一句啃完,今天试图使用最通俗的话语讲明白。 第1章 双向支付通道 使用闪电网络的第一步就是要打开一个双向支付通道,比如A和B之间要打开一个双向支付通道,这到底说的是啥? 如果A和B之间要打开一个支付通道,具体过程是这样的,A和B分别往一个2-2签名的多重签名地址转入一定余额的比特币,比如
企鹅号小编
2018/01/22
1.5K0
闪电网络原理通俗解释
Python中 __init__的通俗解释
作为典型的面向对象的语言,Python中 类 的定义和使用是不可或缺的一部分知识。对于有面向对象的经验、对类和实例的概念已经足够清晰的人,学习Python的这套定义规则不过是语法的迁移。但对新手小白而言,要想相对快速地跨过__init__这道坎,还是结合一个简单例子来说比较好。
计算机与AI
2020/12/14
1.1K0
Python中 __init__的通俗解释
我对云原生的通俗解释
于是,在今年春节返乡途中的高铁上,我对跟朋友解释的内容做了一些丰富,写下此篇文章,尽可能用通俗易懂(但肯定不那么全面和准确)的方式,基于自己的理解,用自己的思路,来试图回答关于云原生的三个哲学之问:“云原生是谁?”、“云原生从哪里来?”、“云原生要到哪里去?”。
SammyLiu
2023/03/08
2K0
我对云原生的通俗解释

相似问题

关于梯度下降函数有没有比较通俗易懂的解释?

1131

有哪些通俗易懂的例子可以解释 IAAS、SAAS、PAAS 的区别?

11.7K

只要音频互动直播的话可以用什么方案?

0195

人脸核身支持读一段特定的话来验证吗?

1185

企业可以用吗?

1205
相关问答用户
某公司 | 程序员擅长1个领域
腾讯云TDP | 先锋会员擅长2个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档