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 ...
随机推荐
- 星际争霸,FF反作弊对战平台
星际一 [FF]反作弊对战平台让作弊行为无所遁形,只为星际玩家服务的反作弊对战平台目前能检查星际霸主以及其他星际争霸ZUOBI软件支持星际113版本 支持XP WIN7 WIN8 MAC 游戏外挂带来 ...
- 在java中异常中的题目---重要的一点
public classTest { public static void main(String[] args) { System.out.println(newTest().test()); } ...
- Cocos2d-x_初探_第一次配置与HelloWorld
此前多久,忘了,反正就是打通关泡泡龙以后.YY君向我推荐了这个(如题).一查资料,诶.还挺有意思的,那我就去下一个玩玩吧. 资料下载清单: 1.Android-ndk 2.Android-sdk 3. ...
- Spring Cloud health节点通过注册中心扫描状态的简单实现
package com.zjs.web; import com.netflix.appinfo.InstanceInfo; import com.zjs.FallbackApiApplication; ...
- 【VS开发】C++ opencv Mat基础
OpenCV2:Mat 1.Mat基础 在计算机内存中,数字图像是已矩阵的形式保存的.OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针. ...
- 查找担保圈-step7-提取未被包含过组的成员,得出结论
USE [test] GO /****** Object: StoredProcedure [dbo].[p05_get_group_member_cleared] Script Date: 2019 ...
- .NET 表达式计算:Expression Evaluator
Expression Evaluator 是一个轻量级的可以在运行时解析C#表达式的开源免费组件.表达式求值应该在很多地方使用,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计 ...
- better-scroll踩坑合集
better-scroll踩坑合集:https://www.jianshu.com/p/6338a8033281
- winform中如何使用timer控件实现欢迎(初始加载)窗口
第一步.新建窗体项目命名为:TestWelcomeFrm,如下图: 第二步.在新项目中,增加欢迎窗口,命名为WelFrm,整个项目目录如下: 第三步.修改program.cs中启动代码如下: WelF ...
- ale.js 对比其他框架
欢迎!我们相信你来这里的目的就是为了解 Ale 与其他大型框架的区别,这也正是我们想要在此回答的. 客观来说,作为 Ale 的核心开发者,我们肯定会更偏爱 Ale,认为对于某些问题来讲用 Ale 解决 ...