当前位置: 首页 > news >正文

JSONP 教程

JSONP 教程

本章节我们将向大家介绍 JSONP 的知识。

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

为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。

什么是同源策略?它是由Netscape提出的一个著名的安全策略,现在所有支持 JavaScript 的浏览器都会使用这个策略。

Jsonp 的实现原理是利用 <script> 标签可以获取不同源资源的特点,来达到跨域访问某个资源的目的。


JSONP 应用

1. 服务端JSONP格式数据

如客户想访问 :​ /try/ajax/jsonp.php?jsonp=callbackFunction​。

假设客户期望返回JSON数据:​["customername1","customername2"]​。

真正返回到客户端的数据显示为: ​callbackFunction(["customername1","customername2"])​。

服务端文件jsonp.php代码为:

<?php header('Content-type: application/json'); 
//获取回调函数名 
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']); 
//json数据 
$json_data = '["customername1","customername2"]'; 
//输出jsonp格式的数据 
echo $jsoncallback . "(" . $json_data . ")"; ?>

2. 客户端实现 callbackFunction 函数

<script type="text/javascript">
function onCustomerLoaded(result, methodName){
    var html = '<ul>';
    for(var i = 0; i < result.length; i++){
        html += '<li>' + result[i] + '</li>';
    }
    html += '</ul>';
    document.getElementById('divCustomers').innerHTML = html;
}
</script>

页面展示

<div id="divCustomers"></div>

客户端页面完整代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>JSONP 实例</title>
</head>
<body>
    <div id="divCustomers"></div>
    <script type="text/javascript">
        function callbackFunction(result, methodName){
            var html = '<ul>';
            for(var i = 0; i < result.length; i++){
                html += '<li>' + result[i] + '</li>';
            }
            html += '</ul>';
            document.getElementById('divCustomers').innerHTML = html;
        }
    </script>
<script type="text/javascript" src="/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
</body>
</html>

jQuery 使用 JSONP

以上代码可以使用 jQuery 代码实例:

<!DOCTYPE html>
<html>
<head>
   <title>JSONP 实例</title>
   <script src="http://apps.bdimg.com/libs/jquery/1.8.3/jquery.js" rel="external nofollow" ></script> 
</head>
<body>
<div id="divCustomers"></div>
<script>
$.getJSON("/try/ajax/jsonp.php?jsoncallback=?", function(data) {
   
  var html = '<ul>';
    for(var i = 0; i < data.length; i++){
       html += '<li>' + data[i] + '</li>';
    }
  html += '</ul>';
  $('#divCustomers').html(html); 
});
</script>
</body>
</html> 

相关文章:

  • Oracle数据库dump文件的导入与导出及创建表空间
  • 淘宝十年资深架构师吐血总结淘宝的数据库架构设计和采用的技术手段。
  • 南大通用数据库-Gbase-8a-学习-32-gccli客户端
  • Linux的scp、rsync、以及集群分发脚本、ssh配置免密登录
  • 【计算机视觉 | 目标检测】锚点预匹配(Anchor pre-matching)的理解
  • 智联物联分享之物联网协议MQTT简述,MQTT协议特点
  • Echarts立体柱状图
  • SpringBoot定时任务@Scheduled注解详解
  • Gen-LaneNet论文精读总结
  • Spring Cloud Alibaba全家桶——微服务网关Gateway组件
  • 基于微信PC端小程序抓包方法
  • SQL Server 实现邮件发送功能(配置步骤及存储过程源码)
  • 刘禹锡最经典诗文10首,每一首都是千古名作,读懂受益一生
  • mybatisplus快速实现动态数据源切换
  • Vue-条件渲染的基本使用(v-if,v-show,v-else相关指令使用)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 4个实用的微服务测试策略
  • canvas绘制圆角头像
  • ES6简单总结(搭配简单的讲解和小案例)
  • GraphQL学习过程应该是这样的
  • input实现文字超出省略号功能
  • iOS | NSProxy
  • Java 网络编程(2):UDP 的使用
  • JDK9: 集成 Jshell 和 Maven 项目.
  • mysql_config not found
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 多线程事务回滚
  • 复习Javascript专题(四):js中的深浅拷贝
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 入门到放弃node系列之Hello Word篇
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微信小程序--------语音识别(前端自己也能玩)
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #14vue3生成表单并跳转到外部地址的方式
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (4)Elastix图像配准:3D图像
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)Linux下编译安装log4cxx
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)我也是一只IT小小鸟
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 服务 ServiceController
  • .NET连接MongoDB数据库实例教程
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET中的Exception处理(C#)
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [22]. 括号生成
  • [Angular 基础] - 表单:响应式表单
  • [Assignment] C++1
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包