美文网首页Ionic3项目实战教程ionic ionic开发
ionic3项目实战教程 - 第3讲 ionic3封装全局网络请

ionic3项目实战教程 - 第3讲 ionic3封装全局网络请

作者: IonicBlog | 来源:发表于2017-08-19 18:09 被阅读4001次

ionic3项目实战教程 - 第3讲 �ionic3封装全局网络请求服务app.service

这一讲主要包含以下几个部分

  • 配置全局的接口地址;
  • 封装http get请求参数编码;
  • 封装特定http get请求;
  • 封装特定http post请求;
  • 封装全局的alert和toast;
  • 封装全局获取/移除缓存数据的函数
  • 在app.module的providers注入全局服务类;

新建一个类,命名为app.service.ts,位于�src/app/目录下,具体代码如下:

app.service.ts

import { LoadingController, AlertController, ToastController } from 'ionic-angular';
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class AppGlobal {
    //缓存key的配置
    static cache: any = {
        slides: "_dress_slides",
        categories: "_dress_categories",
        products: "_dress_products"
    }
    //接口基地址
    static domain = "https://tlimama.tongedev.cn"

    //接口地址
    static API: any = {
        getCategories: '/api/ionic3/getCategories',
        getProducts: '/api/ionic3/getProducts',
        getDetails: '/api/ionic3/details'
    };
}

@Injectable()
export class AppService {

    constructor(public http: Http, public loadingCtrl: LoadingController, private alertCtrl: AlertController, private toastCtrl: ToastController, ) { }

    // 对参数进行编码
    encode(params) {
        var str = '';
        if (params) {
            for (var key in params) {
                if (params.hasOwnProperty(key)) {
                    var value = params[key];
                    str += encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
                }
            }
            str = '?' + str.substring(0, str.length - 1);
        }
        return str;
    }

    httpGet(url, params, callback, loader: boolean = false) {
        let loading = this.loadingCtrl.create({});
        if (loader) {
            loading.present();
        }
        this.http.get(AppGlobal.domain + url + this.encode(params))
            .toPromise()
            .then(res => {
                var d = res.json();
                if (loader) {
                    loading.dismiss();
                }
                callback(d == null ? "[]" : d);
            })
            .catch(error => {
                if (loader) {
                    loading.dismiss();
                }
                this.handleError(error);
            });
    }

    httpPost(url, params, callback, loader: boolean = false) {
        let loading = this.loadingCtrl.create();
        if (loader) {
            loading.present();
        }
        this.http.post(AppGlobal.domain + url, params)
            .toPromise()
            .then(res => {
                var d = res.json();
                if (loader) {
                    loading.dismiss();
                }
                callback(d == null ? "[]" : d);
            }).catch(error => {
                if (loader) {
                    loading.dismiss();
                }
                this.handleError(error);
            });
    }
    
    private handleError(error: Response | any) {
        let msg = '';
        if (error.status == 400) {
            msg = '请求无效(code:404)';
            console.log('请检查参数类型是否匹配');
        }
        if (error.status == 404) {
            msg = '请求资源不存在(code:404)';
            console.error(msg + ',请检查路径是否正确');
        }
        if (error.status == 500) {
            msg = '服务器发生错误(code:500)';
            console.error(msg + ',请检查路径是否正确');
        }
        console.log(error);
        if (msg != '') {
            this.toast(msg);
        }
    }

    alert(message, callback?) {
        if (callback) {
            let alert = this.alertCtrl.create({
                title: '提示',
                message: message,
                buttons: [{
                    text: "确定",
                    handler: data => {
                        callback();
                    }
                }]
            });
            alert.present();
        } else {
            let alert = this.alertCtrl.create({
                title: '提示',
                message: message,
                buttons: ["确定"]
            });
            alert.present();
        }
    }

    toast(message, callback?) {
        let toast = this.toastCtrl.create({
            message: message,
            duration: 2000,
            dismissOnPageChange: true,
        });
        toast.present();
        if (callback) {
            callback();
        }
    }

    setItem(key: string, obj: any) {
        try {
            var json = JSON.stringify(obj);
            window.localStorage[key] = json;
        }
        catch (e) {
            console.error("window.localStorage error:" + e);
        }
    }
    getItem(key: string, callback) {
        try {
            var json = window.localStorage[key];
            var obj = JSON.parse(json);
            callback(obj);
        }
        catch (e) {
            console.error("window.localStorage error:" + e);
        }
    }
}

配置完全局服务类之后,还需要做以下两点更改:

  • 1.在app.module的providers注入全局服务类;
  • 2.因ionic3一些新特性的加入,在使用http网络请求之前,需要导入HttpModule模块;

app.module.ts具体代码如下:

import { HttpModule } from '@angular/http';
import { AppService } from './app.service';
import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';

import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';

@NgModule({
declarations: [
    MyApp
],
imports: [
    BrowserModule, HttpModule,
    IonicModule.forRoot(MyApp)
],
bootstrap: [IonicApp],
entryComponents: [
    MyApp
],
providers: [
    StatusBar,
    SplashScreen, AppService,
    { provide: ErrorHandler, useClass: IonicErrorHandler }
]
})
export class AppModule { }

完!

相关文章

网友评论

  • 111_d8e5:楼主,您可以把后台的接口代码我看看吗,我是学asp.net的
  • 与风逝去的回忆丶:楼主你好,请问我把你github上的例子down下来,在本地怎么运行报错?
  • Andy_永恒:楼主请问有使用的例子吗
    Andy_永恒:@IonicBlog 謝謝
    IonicBlog:github搜索ionic3-dress
  • c98858128d5c:请问下楼主,现在这些接口还能用么? 貌似我这得不到数据。。。
    IonicBlog:@杭州一夜 正在做数据迁移,预计一周内回复
    太空漫游者:是取不到数据
  • 89a1892f44f2:楼主,您好!你的这个方法,get请求倒是没问题了,但是我的post请求为什么一直有问题,我网上查了下资料,说是参数问题,不知道你有进行一试吗,我是新手
    IonicBlog:@89a1892f44f2 是因为后台接口不支持post请求
    89a1892f44f2:@IonicBlog 你方法里面不是有get和post两种请求吗,你的博客里面都是用get请求,但是换成方法里的post请求后就无法实现了,你随便换一个试试,我这里不能上传图片,总之请求不到数据
    IonicBlog:@89a1892f44f2 post什么问题
  • 89a1892f44f2:作者,您好!我是刚开始学ionic2的小白一名,你的资料很详细,但是对于我这个新手还是有部分地方不懂。当我想看看你引用的接口返回的数据时,才发现这两个接口基地址我压根不能再浏览器访问,更别说看数据结构了,请问楼主有什么方法吗?
    getCategories: '/api/ionic3/getCategories',
    getProducts: '/api/ionic3/getProducts',
    getDetails: '/api/ionic3/details'
    IonicBlog:@89a1892f44f2 需要传参
    89a1892f44f2:@IonicBlog 不可以啊。
    tlimama.tongedev.cn/api/ionic3/getCategories这个倒是没问是
    但是这个和下一个就不行了
    https://tlimama.tongedev.cn/api/ionic3/getProducts
    就提示错误了,错误信息找不到与请求 URI“https://tlimama.tongedev.cn/api/ionic3/getProducts”匹配的 HTTP 资源。
    IonicBlog:可以直接访问的
  • 89a1892f44f2:楼主,您好,我是新手,完全是按照你的代码拷贝过来的,但是为什么在这一步骤出现了这个错误
    Error: Uncaught (in promise): Error: No component factory found for TabsPage. Did you add it to @NgModule.entryComponents?
    Error: No component factory found for TabsPage. Did you add it to @NgModule.entryComponents?
    背光的影子_89cf:@zZ_daa8 标签节点不对吧ionic3 应该是<ion-tabs>
    977bb7008935:层主解决了吗这个问题,我也遇到了
  • 40134d66b73e:封装的太棒了 赞
  • c74bbe5501f1:博主封装的不错:+1:不过有一事我想请教一下,从服务器返回的个人信息存储在localStorage好吗?ionic Native提供的secure Storage如何?
    IonicBlog:@大内低手的 都是可行的,Native Storage需要安装插件。
  • bc795beaa94c:楼主,我是照着你这个写的,访问的也是你那边的数据,为什么打包成ios之后获取首页轮播图没问题而打包成Android出现请求资源不存在的错误,返回的状态码是404
    2d6182223e59:404是路径请求不对。按照正常来说不管是安卓还是IOS都应该请求不到。我在chrome中模拟后两个请求错误(getProducts和getDetails)。
  • 程自舟:楼主你这里请求我为啥没看到subscribe难道不是rx订阅吗
    IonicBlog:@程自舟 这里用的是自定义的回调函数
  • 据呵呵:在es6中弃用var了,
    ceido:@IonicBlog 不算弃用吧。。。
    IonicBlog:受教了:+1:
  • peaktan:楼主,你这个没没有请求超时的处理吗
    c74bbe5501f1:@堤岸小跑 ng2和4差不多 并没有语意上的差别 建议好好学习一下 以后有机会交流
    堤岸小跑:楼主继续更新,正跟你学呢,用过ionic1,到3了发现完全不会用,缺失ng2/4的基础
    IonicBlog:请求超时一般都在服务器接口端进行配置,这里请求发生错误会进到handleError函数。

本文标题:ionic3项目实战教程 - 第3讲 ionic3封装全局网络请

本文链接:https://www.haomeiwen.com/subject/kbwtdxtx.html