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

简介: ionic3项目实战教程 - 第3讲 �ionic3封装全局网络请求服务app.service 这一讲主要包含以下几个部分 配置全局的接口地址; 封装http get请求参数编码; 封装特定http get请求; 封装特定http post请求; 封装全局的alert和toast; 封装全局获取/移除缓存数据的函数 在app.
+关注继续查看

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 { }

完!

目录
相关文章
|
5月前
快速入门nest.js(2/10)--Service
意味着对象之间可以创建各种关系,并且对象实例连接在一起的逻辑都可以由Nest运行时系统处理,而不是尝试自己创建和管理这种类型的依赖注入。
43 0
|
5月前
|
前端开发 网络协议 Java
02.【基础】sdk和runtime区别及让你一睹为快使用CLI在CentOS上快速搭建Console,WebApi,MVC三大应用模型
02.【基础】sdk和runtime区别及让你一睹为快使用CLI在CentOS上快速搭建Console,WebApi,MVC三大应用模型
80 0
|
6月前
|
开发框架 前端开发 JavaScript
如何使用React Native构建跨平台APP
React Native是一种流行的跨平台移动应用程序开发框架,它允许开发人员使用JavaScript和React构建本机iOS和Android应用程序。本文将介绍如何使用React Native构建跨平台APP的基本步骤,并提供一些实用的技巧和建议。
207 0
|
7月前
|
JSON 前端开发 数据格式
前端hook项目pc总结笔记-ant design中利用json server模拟请求
前端hook项目pc总结笔记-ant design中利用json server模拟请求
49 0
|
10月前
|
移动开发 小程序 JavaScript
Hybrid app本地开发如何调用JSBridge
Hybrid app本地开发如何调用JSBridge
100 0
Hybrid app本地开发如何调用JSBridge
|
10月前
|
存储 JavaScript 前端开发
利用cordova将网站封装成app
利用cordova将网站封装成app
102 0
|
存储 JSON API
SwiftUI极简教程39:构建一个ColourAtla色卡App
在本章中,你将学会使用URLSession和ContextMenu构建一个ColourAtla色卡App。
355 0
SwiftUI极简教程39:构建一个ColourAtla色卡App
|
开发工具 iOS开发 Perl
关于flutter_module嵌入ios原生项目报错:dyld: Library not loaded: @rpath/App.framework/App解决方案
上个星期,突然有一位做flutter开发的小伙伴添加了我的微信,说他的项目中报dyld: Library not loaded: @rpath/App.framework/App这个错误,说是采用我之前的文章Flutter-module嵌入iOS原生老项目中中的方法可以解决,但是他们是团队开发,路径写死对多人开发不够友好,问我有没有其他解决方案。
关于flutter_module嵌入ios原生项目报错:dyld: Library not loaded: @rpath/App.framework/App解决方案
|
移动开发 前端开发 JavaScript
|
移动开发 前端开发 JavaScript
【整理】Native、Web App、Hybrid、React Native 和 Weex
【整理】Native、Web App、Hybrid、React Native 和 Weex
271 0
相关产品
云迁移中心
推荐文章
更多