js jsonp

蔡勋
• 阅读 1780

json和jsonp的关系

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
  • JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

json和jsonp缩写只相差一个字母,但是两者却完全不同。前者是一种数据的表达方式,后者则是网络请求的一种解决方案。

同源策略

使用ajax发送网络请求有一个条件,那就是同源策略

同源策略要求:

  1. 协议类型相同 -> httphttpsftp等等
  2. 主机地址相同 -> https://www.baidu.com/ 或者自己的主机ip地址
  3. 端口号相同 -> 808080等等

例如平常使用webstorm进行调试的时候,webstorm会开一个本地服务器http://localhost:63342/xxxx,但是如果你使用ajax去访问https://www.baidu.com/之类的服务器你是无法拿到数据的。实际上浏览器已经拿到数据,但是做了一层隔离,不给你数据。

jsonp原理

在说原理之前首先要了解两个关于<script>的特点

  1. <script>标签可以使用cdn加速(根据浏览器所在网络地区,从最近的服务器下载js脚本,一般下载框架和库),那么cdn的服务器毫无疑问是不同源的。所以,<script>标签可以跨域访问别的服务器
  2. <script>标签是通过src节点属性获取js代码的,并且获取到的代码可以直接执行

在了解了上面的2个<script>的特点之后大概都能猜出来,jsonp就是使用<script>以上两个特点来实现的,具体的实现方式有2种。

  • 方式一

    1. 创建一个函数(名字随机生成,避免多次请求被覆盖),并且接收一个参数(服务器返回的数据)。
    2. 利用<script>标签发送请求,拼接上callback=方法名参数。
    3. 后端要求接收这个callback参数,拿到方法名后在方法名后拼接(),并且传入返回的数据

这种方式对于php来说就是字符串拼接,但是传回来的时候则是被js解析成调用对应的方法了。

// php
$res = file_get_contents($url);
$func = $_GET[callback];

echo callback.'('.$res.')';
  • 方式二

    1. 使用php或者nodejs去访问需要跨域的请求
    2. 用ajax访问这个php或者nodejs脚本

jsonp无论如何都要后端支持(要么是自己的后端写的php,要么是别人接口支持jsonp跨域的回调方法),否则无法使用。

 方式一示例

// 1. 创建一个script标签
var script = document.createElement('script');

// 2. 随机生成一个方法
// 用时间戳作为种子,这样随机生成的方法名绝对没有重复的。
var funcName = 'jsonpFunc' + Math.floor(new Date().getTime() * Math.random());
window[funcName] = function (json) {
    console.log(json);

    // 把请求完的标签从文档中移除
    document.head.removeChild(script);
};

// 3. 拼接请求地址,加上回调
script.src = 'http://api.douban.com/v2/movie/in_theaters?callback=' + funcName;

// 4. 把script标签放到文档中,就会发送请求
document.head.appendChild(script);

封装一下:

window.myJsonp = function (opt) {

    // 简单的容错
    if (!opt || !opt.url) return;
    opt.callback = opt.callback || 'callback';
    opt.params = opt.params || {};
    opt.callback = opt.callback || function () {};

    // 1. 创建一个script标签
    var script = document.createElement('script');

    // 2. 随机生成一个方法
    var funcName = 'jsonpFunc' + Math.floor(new Date().getTime() * Math.random());
    window[funcName] = function (json) {

        // 5. 把请求完的标签从文档中移除
        document.head.removeChild(script);
        // 6. 删除添加到window的方法名称,避免污染
        delete window[funcName];

        // 7. 把获取到的数据通过回调的方式传出去
        opt.callback(json);
    };

    // 3. 拼接请求地址,加上回调(参数拼接和get请求一致)
    var params = '';
    for (var key in opt.params) {
        params += key + '=' + opt.params[key] + '&';
    }
    script.src = opt.url + '?' + params + 'callback=' + funcName;

    // 4. 把script标签放到文档中,就会发送请求
    document.head.appendChild(script);
};


// 使用
myJsonp({
    url: 'http://api.douban.com/v2/movie/in_theaters',
    callback: function (json) {
        console.log(json);
    }
});

方式二

待续。。。

点赞
收藏
评论区
推荐文章
DejiaVu DejiaVu
4年前
你不知道的JSON Schema
1、JSON?JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。具有简洁、可读性高、支持广泛的特点。下面我们用JSON描述了一个商品的基本信息,包含了JSON的一些基本数据的类型。json{"productId":1,"
Aidan075 Aidan075
4年前
一篇长文带你在python里玩转Json数据
↑一个宝藏公众号,长的好看的人都关注了Json简介Json(JavaScriptObjectNotation)很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的,它们返回的数据都是Json格式的。这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大
Bill78 Bill78
4年前
Python中JSON的基本使用_Just do it !
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。Python3中可以使用json模块来对JSON数据进行编解码,它主要提供了四个方法:dumps、dump、loads、load。dump和dumpsdump和dumps对python对象进行序列化。将一个Python对象
Wesley13 Wesley13
3年前
JSON的简单认识
1前言JSON(JavaScript Object Notation):JavaScript对象表示法。其是一种轻量级的数据交换格式,简洁和清晰的层次结构使得其成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。通常用于与服务端交换数据。如心知天气服务器
Wesley13 Wesley13
3年前
JavaWeb 之 JSON
一、概述  1、概念JSON:JavaScriptObjectNotation JavaScript对象表示法  2、基本格式varp{"name":"张三","age":23,"sex":"男"};  3、用途和优点(1)json现在多用于存储
Wesley13 Wesley13
3年前
JSON学习笔记(二、语法)
JSON和js关系欲学JSON先学js,那么JSON和js的关系是什么样的呢?.JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。.JSON语法是JavaScript语法的子集基本语法.数据在名称/值对中.数据由逗号分隔.大括号保存对象.中括号保
Easter79 Easter79
3年前
Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】
Json简介Json(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的fastjson(java),腾讯的rapidjson(c)等。但.Net却没有得到大厂的青睐,在Swifter.Json之前.Net的J
Stella981 Stella981
3年前
Python and JSON
什么是json:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLanguage,StandardECMA2623rdEditionDecember1999的一个子集。JSON采用完全独立于语言的
Wesley13 Wesley13
3年前
JSON
JSON(JavaScriptObjectNotation,js对象表示法)  是存储和交换文本信息的语法,类似 XMLJSON的文件类型是“.json”优点:    比XML更小、更快,更容易解析      是轻量级的文本数据交换格式   结构清晰简洁,易于阅读和编写,也易于机器的解析和生成,可以有效的提
Stella981 Stella981
3年前
Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件
实际项目中,读取相关的系统配置文件是很常见的事情。今天就来说一说,Golang是如何读取YAML,JSON,INI等配置文件的。1\.json使用JSON应该比较熟悉,它是一种轻量级的数据交换格式。层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成。  1.创建conf.json:{
Java常用的JSON序列化与反序列化工具实践
JSON简介:JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,通常用于在不同系统之间传输数据。它基于JavaScript对象语法,但已成为一种独立于语言的格式。JSON数据以键值对的形式组织,易于阅读和编写。为什么要