angular4.0使用JSONP数据请求
ng4中有很多获取数据的API,为了满足跨域的需求,我选择JSONP模块;
应该有很多小伙伴遇到这个报错吧 injected script did not invoke callback;
下面我写个完整的demo来解决这个问题。
一、在app.module.ts模块中,注入JsonpModule模块
import {JsonpModule} from "@angular/http";
@NgModule({
imports: [
JsonpModule //注入JSonpModule模块
]
})
二、创建服务httpService,并注入jsonp和map
import { Injectable } from '@angular/core';
import {Jsonp} from "@angular/http"; //注入Jsonp模块
import 'rxjs/add/operator/map'; //注入map
@Injectable()
export class HttpService {
}
三、拼接请求url,编写统一请求方法
这步最关键了,我们知道jsonp的请求地址是需要写callback回调参数的,用作script标签的id名;
就像下面的代码,至于为啥callback="__ng_jsonp__.__req0.finished"这样的形式;我也不是很明白。
let url1 = baseUrl + "&callback=" + "__ng_jsonp__.__req0.finished";
let url2 = baseUrl + "&callback=" + "__ng_jsonp__.__req1.finished";
很明显,只要我们保证callback如上的结果,就可以正常的请求数据了,req0,req1……依次累加;
请求的核心代码是jsonp的subscribe方法,回调函数中返回数据,代码如下:
this.jsonp.get("请求地址").map(res => res.json()).subscribe(data => {
// data为返回值
console.log(data);
});
封装的完整httpService代码如下
static times = 0; 定义一个静态属性,用来记录httpSerivice服务的请求次数,每次请求就+1,这样保证每次请求的callback回调名都不一样;
import { Injectable } from '@angular/core';
import {Jsonp} from "@angular/http";
import 'rxjs/add/operator/map';
@Injectable()
export class HttpService {
static times = ; // 用于记录jsonp请求的次数
private baseUrl: string = 'http://q.letwx.com/api/jsapi';
private sameKey: string = '&uid=' + Config.uid + '&wxapiopenid=' + Config.apiopenid + '&wxapitoken=' + Config.apitoken + '&debug=nf';
public ACTION: any = { // all action
ACTLIST: 'schoolsign/teacher/actlist', // 查看签到列表
ACTINFO: 'schoolsign/teacher/actinfo', // 查看签到信息
STUADD: 'schoolsign/teacher/stuadd', // 添加学生
STULIST: 'schoolsign/teacher/stulist', // 查看学生列表
STUEDIT: 'schoolsign/teacher/stuedit', // 编辑学生姓名
STUDEL: 'schoolsign/teacher/studel', // 删除学生
ACTADD: 'schoolsign/teacher/actadd', // 添加签到活动
};
constructor(
private jsonp: Jsonp
) {}
getJSON(action: string, params: object, cb?: any): any {
let callback = "&callback=" + "__ng_jsonp__.__req" + HttpService.times + ".finished";
HttpService.times ++;
let url = this.baseUrl + '?action=' + action + '¶ms=' + JSON.stringify(params) + this.sameKey + callback;
this.jsonp.get(url).map(res => res.json()).subscribe(data => {
cb && cb(data);
});
}
}
四、在app.module.ts模块中,注入服务httpService
@NgModule({
imports: [
JsonpModule
],
providers: [
HttpService
]
})
ok,有问题请留言吧!
angular4.0使用JSONP数据请求的更多相关文章
- 跨站数据请求哪家强——青出于蓝的jsonp
/* * 跨站数据请求哪家强--青出于蓝的jsonp数据格式 * @author gj * @date 2017-09-15 */ 先哲有云"青,取之于蓝,而青于蓝:冰,水为之,而寒于水&q ...
- 使用jQuery-AJAX–读取获得跨域JSONP数据的示例
在项目开发中,如果在同一个域名下就不存在跨域情况,使用$.getJSON()即可实现.但是需要跨域请求其他域名下面的Json数据就需要JSONP的方式去请求,跨域写法和getJSON有差异.如下: ...
- Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...
- get,post,jsonp数据交互—百度下拉列表
三种数据交互形式:get post jsonp 一.get请求 1.引入 vue.js 和 vue-resource.js , 准备一个按钮 <input type="button& ...
- 前端笔记之服务器&Ajax(下)数据请求&解决跨域&三级联动&session&堆栈
一.请求后端的JSON数据 JSON是前后端通信的交互格式,JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. JSON是互联网各个后台与 ...
- vue2-通过axios实现数据请求
1.通过axios实现数据请求 vue.js默认没有提供ajax功能 所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互. 注意,axios本质上就是javascr ...
- day 74 vue 2 axios数据请求 以及组件的学习
前情提要: vue 学习二: 一: 通过axios实现数据请求 1:json数据语法 json数据对象类似于JavaScript中的对象,但是它的键对应的值里面是没有函数方法的,值可以是普通变量, ...
- sencha touch结合webservice读取jsonp数据详解
sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下: Ext.define('eparkapp.store.ParksNearb ...
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...
随机推荐
- 一个js的动画,以前以为只有flash可以实现
11年刚干这行的时候,看到这种什么百叶窗的动画,以为都是flash实现的,最近突然灵光一闪,想到了用js实现(虽然我不是做前端的,本人做.net).代码虽然实现了,但是比较乱,先上个图: 代码主要就是 ...
- Linux 多进程多线程相关概念
进程:可执行程序是存储在磁盘设备上的由代码和数据按某种格式组织的静态实体,而进程是可被调度的代码的动态运行.在Linux系统中,每个进程都有各自的生命周期.在一个进程的生命周期中,都有各自的运行环境以 ...
- Android官方命令深入分析之AVD Manager
作者:宋志辉 AVD Manager提供了一个图形用户接口,通过它你能够创建和管理AVDs. 你能够通过下面方式执行AVD Manager: Eclipse:选择 Window > Androi ...
- Unix:关于一个file在file system和disk中占用空间
參考文献: Harley Hahns:Guide to Unix and Linux. Chap 24 -->首先要有的关键概念:the amount of "disk space&q ...
- 不用分支语句实现1+2+。。。+n
要求: 不使用乘除法.for.while .if.else.switch.case.以及A?B:C三元表达式 求1+2+3+...+n 此题思路有多种,能够用多态.构造函数.递归.和模板元. 我在看到 ...
- 关于O(logN)的正确理解
学计算机的或许对O(logN)这个符号并不陌生,快排.堆排.归并等等排序的平均时间复杂度. 问题来了,之前一直有个歧义就是:logN的底数到底是多少? 这个问题搁置着并没有去深究,仅仅是想应该是2吧. ...
- IDEA+PHP+XDebug调试配置
XDebug调试配置 临时需要调试服务器上的PHP web程序,因此安装xdebug,下面简单记录 安装xdebug 下载最新并解压 wget https://xdebug.org/files/xde ...
- Selenium Python 安装指导
最近无聊.又重新装了个selenium 果然时代变了.安装的时候的方法和以前不太一样了.因此觉得有必要单列出来加以说明 另外备注:测试小伙伴们.安装此类工具报错.尝试以下两个方案之一: 1.请转sta ...
- mysql查询进程、导入数据包大小设置
mysql查询进程.导入数据包大小设置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-12-27 查询正在执行的进程: ...
- intellij idea svn使用一 导入、更新、提交、解决冲突
大体上是转载,针对版本14有一些特殊的添加. 查看svn的资源库: 下面的多出了一个svn的窗口,在左边有加号可以添加一个svn的库 输入svn的地址,我用的是本地的测试,所以地址为svn://127 ...