什么叫jsonp?

jsonp是json with padding(填充式json或参数式json)的简写,是通过ajax请求跨域接口,获取数据的新实现方式

jsonp的实现原理:

动态创建script标签,因为script标签是没有同源策略限制,可以跨域的。 把script标签的src指向正式服务端地址,这个地址跟个参数callback=xxx, 服务端在返回数据时,在xxx里包裹一个方法(里面是返回的数据),相当于在前端执行xxx这个方法,但是浏览器并没有这个方法,所以在发送请求之前在window注册这个方法,这样的话相当于在前端执行window.xxx()这个方法去获取数据。 具体看接下来的实现!

https://github.com/webmodules...
这个是jsonp库的具体实现,建议下载来研究一下,最好自己动手写一遍。本文主要是Promise封装,所以就不具体介绍jsonp的具体实现

步骤一:

首先安装这个库,因为我是在node npm环境下开发,所以

 $ npm install jsonp

参数介绍
jsonp(url, opts, fn)
url (String) 服务器端数据接口地址
opts (Object) 一般只需关注param即可

  • param (String) 默认是callback,这是与后端约定的参数名称,也可以随便定义,只要前后端统一

  • timeout (Number) 请求超时时间,默认是6000ms

  • prefix (String) callback值的前缀,默认是__jp

  • name (String) 指定全局注册的回调方法名,一般不会用到,因为默认是prefix+自增数字

fn 回调方法,用es6 Promise

步骤二:

下面是具体用法:
建一个名叫jsonp.js的文件
先引入jsonp库文件

 import originJSONP from 'jsonp'

对外暴露方法 url:请求服务器地址,data:参数

 export default function jsonp(url,data,option) {
url += (url.indexOf('?')<0?'?':'&')+param(data)
return new Promise(function(resolve,reject) {
originJSONP(url,option, function(err,data) {
if(!err){
resolve(data)
}else{
reject(err)
}
})
})
}

定义一个将Object的参数处理成为 url挂载参数的形式 的函数

 export function param(data) {
let url = ''
for (var k in data) {
let value = data[k] !== undefined ? data[k] : ''
url += '&' + k + '=' + encodeURIComponent(value)
}
return url ? url.substring(1) : ''
}

到这里 这个Promise 就封装好了,接下来就具体调用来获取数据

步骤三:

建一个js文件,名字自己定义
引入前面封装的jsonp.js

 import jsonp from '../common/js/jsonp.js'

定义参数

 const commonParams = {
g_tk:1319877694,
inCharset:'utf-8',
outCharset:'utf-8',
notice:0,
format:'jsonp'
};

定义前后端统一参数

 const options = {
param:'callback'
};

获取referer

 export function getReferer() {
let refer = document.referrer,
reg = /(\w+):(\/\/[^/:]+)([^# ]*)/;
if (!!refer && !refer.match(reg)[2].match(/(www|m).joyme.com/g)) {
return refer;
} else {
return "";
}
}

完整封装jsonp

 import originJSONP from "jsonp";
import { getReferer } from "js/utils";
export default function jsonp(url, data, option) {
const refer = getReferer();
if(!url.includes("show.g.mediav.com")){
url += `?platform=0&referer=${refer}`;
}
// console.log('url:::', url);
url += (url.indexOf("?") < 0 ? "?" : "&") + param(data);
return new Promise((resolve, reject) => {
originJSONP(url, option, (err, data) => {
if (!err) {
resolve(data);
} else {
reject(err);
}
});
});
} function param(data) {
let url = "";
for (var k in data) {
let value = data[k] !== undefined ? data[k] : "";
url += `&${k}=${encodeURIComponent(value)}`;
}
return url ? url.substring(1) : "";
}

api调用

 const decode = val => decodeURIComponent(val);
let BASEURL = "";
const env = process.env.NODE_ENV;
// console.log('env===', env)
if (env === "development") {
BASEURL = `//test.appapi.joyme.com/web/`;
} else if (env === "test") {
BASEURL = `//test.appapi.joyme.com/web/`;
} else if (env === "gray") {
BASEURL = `//apptest.joyme.com/web/`;
} else {
BASEURL = `//appapi.joyme.com/web/`;
}
const APPOINTURL = `${BASEURL}appoint`;
/**
* 根据tag(版区名称)获取瀑布流数据
* @param {版区名称(标签)} tag
* @param {当前页数} page
* @param {第二页时需要传入上一页最后一条数据的mtime} lastDataMTime
*/
export const getDataByTag = (tag, page, lastDataMTime) =>
jsonp(
APPOINTURL,
{
uri: decode("block/detail"),
tag: decode(tag),
page: page,
order_val: lastDataMTime
},
options
);
 

jsonp的原理介绍及Promise封装的更多相关文章

  1. vue中利用Promise封装jsonp并调取数据

    Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...

  2. js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)

    最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下 ...

  3. 03 Yarn 原理介绍

    Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理   Hadoop的1.X架构的介绍   在1.x中的NameNodes只可能有一个,虽然可以通过Se ...

  4. jsonp协议原理深度解析

    前言 今天在开发联调的过程中,需要跨域的获取数据,因为使用的jquery,当然使用dataType:'jsonp'就能够很easy的解决了.但是因为当时后端没有支持jsonp来访问,后来他在实现这个功 ...

  5. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  6. Sql注入基础原理介绍

    说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...

  7. Hadoop介绍-3.HDFS介绍和YARN原理介绍

    一. HDFS介绍: Hadoop2介绍 HDFS概述 HDFS读写流程   1.  Hadoop2介绍 Hadoop是Apache软件基金会旗下的一个分布式系统基础架构.Hadoop2的框架最核心的 ...

  8. JSONP的原理与实现(基于jQuery)

    为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP. 这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大.这 ...

  9. React Native 网络请求封装:使用Promise封装fetch请求

    最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...

随机推荐

  1. svn--备忘

  2. Requests API

    Requests API http://docs.python-requests.org/en/latest/ requests的具体安装过程请看: http://docs.python-reques ...

  3. Net分布式系统之七:日志采集系统(1)(转)

    http://www.cnblogs.com/Andon_liu/p/7508107.html 日志对大型应用系统或者平台尤其重要,系统日志采集.分析是系统运维.维护及用户分析的基础. 一.系统日志分 ...

  4. idea中maven右键没有show dependencies选项

    如图,idea高版本(2018.3.4)中maven 的右键没有show dependencies菜单 查看依赖包方法,双击pom.xml文件,在文件编辑页面右键maven或者diagrams弹出依赖 ...

  5. leetcode 股票系列

    五道股票题总结: 121 买卖股票的最佳时机 122 买卖股票的最佳时机 124 买卖股票的最佳时机4 309  最佳股票买卖含冷冻期 714 买卖股票的最佳时机含有手续费 121 买卖股票的最佳时机 ...

  6. JavaScript之屏幕上下左右滑动监听

    前言 存在这么一个需求,根据用户在屏幕不同的滑动方向(上.下.左.右),使用js脚本判断出不同的滑动行为,更新网页为不同的界面. 源码 参考了博文[1]的源码,但由于存在一些漏洞,比如:上下滑动事件监 ...

  7. Vuex模块:开启命名空间

    模块开启命名空间后,享有独自的命名空间. { "模块1":{ state:{}, getters:{}, mutations:{}, actions:{} }, "模块2 ...

  8. clrscr()及gotoxy()函数

    1.clrscr() 作用:清屏,跟 cmd 中的清屏作用一样 注意:只有在 Trubo C 中能用,需要包含头文件:conio.h 替代:system("cls"); 需要头文件 ...

  9. Windows WSL 安装OpenCV

    安装WSL 启动WSL功能 首先启动WSL功能,下面提供两个办法 Powershell --> 管理员权限 --> 运行 Enable-WindowsOptionalFeature -On ...

  10. C语言递归之对称二叉树

    题目描述 给定一个二叉树,检查它是否是镜像对称的. 示例 二叉树 [1,2,2,3,4,4,3] 是对称的. / \ / \ / \ [1,2,2,null,3,null,3] 则不是镜像对称的. / ...