jsonp的原理介绍及Promise封装
什么叫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封装的更多相关文章
- vue中利用Promise封装jsonp并调取数据
Promise就是一个给一步操作提供的容器,在这个容器里,有两个阶段无法改变的阶段,第一个阶段就是Pending(进行),第二个阶段就是结果阶段,包含Fulfilled(成功).Rejected(失败 ...
- js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
最近做了一个项目,需要用子域名调用主域名下的一个现有的功能,于是想到了用jsonp来解决,在我们平常的项目中不乏有这种需求的朋友,于是记录下来以便以后查阅同时也希望能帮到大家,需要了解的朋友可以参考下 ...
- 03 Yarn 原理介绍
Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理 Hadoop的1.X架构的介绍 在1.x中的NameNodes只可能有一个,虽然可以通过Se ...
- jsonp协议原理深度解析
前言 今天在开发联调的过程中,需要跨域的获取数据,因为使用的jquery,当然使用dataType:'jsonp'就能够很easy的解决了.但是因为当时后端没有支持jsonp来访问,后来他在实现这个功 ...
- Android Animation学习(一) Property Animation原理介绍和API简介
Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...
- Sql注入基础原理介绍
说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...
- Hadoop介绍-3.HDFS介绍和YARN原理介绍
一. HDFS介绍: Hadoop2介绍 HDFS概述 HDFS读写流程 1. Hadoop2介绍 Hadoop是Apache软件基金会旗下的一个分布式系统基础架构.Hadoop2的框架最核心的 ...
- JSONP的原理与实现(基于jQuery)
为什么会有JSONP?因为我们使用AJAX,使用AJAX可能就会遇到跨域的需求,如何解决呢,对,就是JSONP. 这里注意下JSON和JSONP不是一类,虽然他们只是一个字母只差,但是实际差别很大.这 ...
- React Native 网络请求封装:使用Promise封装fetch请求
最近公司使用React作为前端框架,使用了异步请求访问,这里做下总结: React Native中虽然也内置了XMLHttpRequest 网络请求API(也就是俗称的ajax),但XMLHttpRe ...
随机推荐
- itchat库微信自动回复祝福语
过年了,之前看到一些python文章介绍用itchat自动回复微信,我自己就写了一个. 官方文档https://itchat.readthedocs.io/zh/latest/,这个库挺简洁的,对着接 ...
- NFS PersistentVolume(8)
一.部署nfs服务端: k8s-master 节点上搭建了 NFS 服务器 (1)安装nfs服务: yum install -y nfs-utils rpcbind vim /etc/exports ...
- 阻塞IO和非阻塞IO的区别
转载地址: http://blog.sina.com.cn/s/blog_a46817ff0101g0gv.html http://blog.csdn.net/nodeathphoenix/artic ...
- DISCUZ论坛各大功能模块入口文件介绍
index.php 首页入口文件,这个文件相信大家都不陌生,小编就不具体介绍了. forum.php 论坛入口文件 portal.php 门户入口文件 group.php 群组入口文件 home.ph ...
- Java内部类(4):静态内部类&接口内部类
使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类.静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向 ...
- linux 网络相关
1. 配bond 模式 将eth0 和 eth1 绑定 ,master 为bond2 ,直接上文件 eth0 和 eth1 , 类似,如下 ,关键点 MASTER and SLAVE TYPE ...
- layui 第三方组件 eleTree 树组件 树形选择器
使用 JS位置 ,layui/lay/modules/eleTree.js:CSS位置 ,layui/css/modules/eleTree/eleTree.css: ## 下面应用即可页面css引用 ...
- 题解 洛谷P1311 【选择客栈】
可能这做法是最奇葩的ST表 我们枚举k,计算每种色调的客栈各有多少种方法 我们利用一种奇怪的思想:除了不可行的,剩下的都是可行的 所以我们先求出 每种颜色的客栈随机选择两个,一共有多少种结果 接着减 ...
- Thinkphp5 自定义上传文件名
这几天在做tp5的上传文件模块,项目需求是要把文件名在上传之后修改为 用户名+原文件名的组合形式,在网上找了一会儿发现好像没有类似的文章...只好自己去研究研究了. 之前查看过看云上面的官方手册,文件 ...
- package[golang]学习笔记之runtime
*获取当前函数名称,文件名称,行号等信息.通过这个函数配合Println函数可以方便的获取错误信息的位置 var n int //n==0 当前 //n==1 调用函数 //n==2 调用函数的调用函 ...