什么叫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. Ubuntu16.04格式化U盘

    root@ubuntu:~# fdisk -l root@ubuntu:~# fdisk /dev/sdb 格式化U盘: root@ubuntu:~# fdisk -l sudo mkfs.ntfs ...

  2. 转 MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法

    http://blog.sina.com.cn/s/blog_637e04c9010117ri.html 1 问题 [root@localhost mysql]# /etc/rc.d/init.d/m ...

  3. Python-sympy科学计算与数据处理(求极限及其它功能)

    极限 其它功能

  4. Python multiprocess模块(中)

    主要内容: 一. 锁 二. 信号量 三. 事件 通过event来完成红绿灯模型 四. 队列(重点) 队列实现进程间的通信 五. 生产者消费者模型 1. 初始版本(程序会阻塞住) 2. 升级版本一(通过 ...

  5. mdk3 工具使用-表白神器

    一:在root目录下新建个txt文档,用vim编辑文档,写几段暧昧的话 二:终端执行命令: 开启网卡监听模式 airmon-ng start wlan0 开启无线广播 mdk3 wlan0mon b ...

  6. 使用PowerShell 修改DNS并加入域中

    运行环境:Windows Server 2012 R2 此powershell脚本为自动修改本机DNS并加入到域中 但有的时候会提示[本地计算机当前不是域的一部分.请重新执行脚本!]错误,如遇到该错误 ...

  7. Springboot Rabbitmq 使用Jackson2JsonMessageConverter 消息传递后转对象

    Springboot为了应对高并发,接入了消息队列Rabbitmq,第一版验证时使用简单消费队列: //发送端 AbstractOrder order =new Order(); rabbitmqTe ...

  8. ZOJ Problem Set - 1005

    注意,条件:B>=C .应考虑B=C的情况. #include<iostream> using namespace std; int A,B,C; void jugs(int a,i ...

  9. PYTHON 100days学习笔记007-2:python数据类型补充(2)

    目录 day007:python数据类型补充(2) 1.Python3 元组 1.1 访问元组 1.2 删除元组 1.3 元组运算符 1.4 元组索引,截取 1.5 元组内置函数 2.python3 ...

  10. [bzoj4842][bzoj1283][Neerc2016]Delight for a Cat/序列_线性规划_费用流

    4842: [Neerc2016]Delight for a Cat_1283: 序列 题目大意:ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ...