ionic2(仿单糖app)-04网络请求封装

主要内容

  • http get 请求
  • http post 请求
  • 全局的工具类
新建一个http请求类服务

HttpService.ts

/**
 * Created by Void on 2017/7/13.
 *
 *  网络请求服务类
 */

import {Injectable} from '@angular/core';
import {
    Http, Headers, RequestOptions, URLSearchParams, RequestOptionsArgs, RequestMethod
} from '@angular/http';
import 'rxjs/add/operator/toPromise';
import {Observable} from "rxjs";
import {NativeServiceC} from "./NativeServiceC";
import {AlertController} from "ionic-angular";
import {APP_SERVE_URL} from "./Constants";

@Injectable()
export class HttpService {

    constructor(public http:Http,
                private nativeService:NativeServiceC,
                private alertCtrl:AlertController) {
    }

    public request(url:string, options:RequestOptionsArgs) { //:Observable<Response>
        url = HttpService.formatUrl(url);
        this.optionsAddToken(options);
        return Observable.create(observer => {
            this.nativeService.showLoading();
            this.http.request(url, options)
                .map(res => res.json())
                .subscribe(res => {
                    if (res.code == 200) {
                        observer.next(res.data);
                    } else {
                        this.requestFailed(url, options, {status: res.code});//处理请求失败
                    }
                }, err => {
                    this.requestFailed(url, options, err);//处理请求失败
                    observer.error(err);
                });
        });
    }

    public get(url:string, paramMap:any = null) { //:Observable<Response>
        return this.request(url, new RequestOptions({
            method: RequestMethod.Get,
            search: HttpService.buildURLSearchParams(paramMap)
        }));
    }

    public post(url:string, body:any = null):Observable<any> {
        return this.request(url, new RequestOptions({
            method: RequestMethod.Post,
            body: body,
            headers: new Headers({
                'Content-Type': 'application/json; charset=UTF-8'
            })
        }));
    }

    public jsonRpc(model:string, method:string, args:any, kwargs?:any):Observable<any> {

        kwargs = kwargs || {};
        kwargs.context = kwargs.context || {};
        Object.assign(kwargs.context, {
            lang: "zh_CN",
            tz:"Asia/Hong_Kong"
        });

        let params = {
            model: model,
            method: method,
            args: args,
            kwargs: kwargs,
        };
        return this.request("http://101.200.124.206:4713/web/dataset/call_kw", new RequestOptions({
            method: RequestMethod.Post,
            body: this.jsonrpcBuildSender(params),
            headers: new Headers({
                'Content-Type': 'application/json; charset=UTF-8',
                "X-Openerp-Session-Id": 'a6e881e882dff5ca206b916753601873690cfbab',
                // "Authorization": "Basic " + btoa(`${null}`)
            })
        }));
    }

    public jsonRpcLogin(login: string, password: string,db?: string){
        db = db || 'hospital-saas';
        let params = {
            db : db,
            login : login,
            password : password
        };
        return this.request("http://101.200.124.206:4713/web/session/authenticate",{
            method:RequestMethod.Post,
            body: this.jsonrpcBuildSender(params),
        });
    }

    private jsonrpcBuildSender(params:Object):Object{
        let option = {
            jsonrpc: "2.0",
            method: "call",
            params: params, // payload
            id:new Date().getTime()
        };
        return option;
    }


    /**
     * 将对象转为查询参数
     * @param paramMap
     * @returns {URLSearchParams}
     */
    private static buildURLSearchParams(paramMap):URLSearchParams {
        let params = new URLSearchParams();
        if (!paramMap) {
            return params;
        }
        for (let key in paramMap) {
            let val = paramMap[key];

            // todo 暂时不处理时间
            // if (val instanceof Date) {
            //     val = Utils.dateFormat(val, 'yyyy-MM-dd hh:mm:ss')
            // }
            params.set(key, val);
        }
        return params;
    }

    /**
     * 处理请求失败事件
     * @param url
     * @param options
     * @param err
     */
    private requestFailed(url:string, options:RequestOptionsArgs, err):void {
        this.nativeService.hideLoading();
        console.log('%c 请求失败 %c', 'color:red', '', 'url', url, 'options', options, 'err', err);
        let msg = '请求发生异常', status = err.status;
        if (!this.nativeService.isConnecting()) {
            msg = '请求失败,请连接网络';
        } else {
            if (status === 0) {
                msg = '请求失败,请求响应出错';
            } else if (status === 404) {
                msg = '请求失败,未找到请求地址';
            } else if (status === 500) {
                msg = '请求失败,服务器出错,请稍后再试';
            }
        }
        this.alertCtrl.create({
            title: msg,
            subTitle: '状态码:' + status,
            buttons: [{text: '确定'}]
        }).present();
    }

    /**
     * url中如果有双斜杠替换为单斜杠
     * 如:http://88.128.18.144:8080//api//demo. 替换后http://88.128.18.144:8080/api/demo
     * @param url
     * @returns {string}
     */
    private static formatUrl(url:string):string {
        if (url.indexOf('http://') == -1 && url.indexOf('https://') == -1) {
            url = APP_SERVE_URL + url;
        }
        let index = url.indexOf('//') + 2;
        return url.substring(0, index) + url.substring(index).replace(/\/\//g, '/');
    }

    private optionsAddToken(options:RequestOptionsArgs):void {
        let token = 'TOKEN'; //this.globalData.token;
        if (options.headers) {
            options.headers.append('token', token);
        } else {
            options.headers = new Headers({
                'token': token
            });
        }
    }
}

上面有几个jsonrpc的方法可以忽略不看,是测试odoo后台使用的
该文件中导入了 NativeServiceC服务,所以需要有该服务。

新建一个NativeService工具类服务

NativeServiceC.ts

/**
 * Created by Void on 2017/7/13.
 *
 *  调用手机硬件的类
 *
 * plugins: status splash network
 *
 *
 */

import {Injectable} from '@angular/core';
import {ToastController, LoadingController, Platform, Loading, AlertController} from 'ionic-angular';
import {StatusBar} from "@ionic-native/status-bar";
import {SplashScreen} from "@ionic-native/splash-screen";
import {Network} from '@ionic-native/network';

import {GlobalData} from './GlobalData'

@Injectable()
export class NativeServiceC {
    private loading:Loading;
    private loadingIsOpen:boolean = false;

    constructor(private platform:Platform,
                private toastCtrl:ToastController,
                private alertCrl:AlertController,
                private loadingCtrl:LoadingController,
                private statusBar:StatusBar,
                private splashScreen:SplashScreen,
                private network:Network,
                private globalData:GlobalData) {
    }

    log(info):void {
        console.log('%cNativeService/' + info, 'color:#C41A16');
    }

    statusBarStyleDefault():void {
        this.statusBar.styleDefault();
    }

    splashScreenHide():void {
        this.splashScreen.hide();
    }

    getNetworkType():string {
        if (!this.isMobile()) {
            return 'wifi';
        }
        return this.network.type;
    }

    isConnecting():boolean {
        return this.getNetworkType() != 'none';
    }

    isMobile():boolean {
        return this.platform.is('mobile') && !this.platform.is('mobileweb');
    }

    isAndroid():boolean {
        return this.isMobile() && this.platform.is('android');
    }

    isIos():boolean {
        return this.isMobile() && (this.platform.is('ios') || this.platform.is('ipad') || this.platform.is('iphone'));
    }

    alert(title:string):void {
        this.alertCrl.create({
            title:title,
            buttons:[{text:'确定'}]
        }).present();
    }

    /**
     * 统一调用此方法显示loading
     * @param content 显示的内容
     */
    showLoading(content:string = ''):void {
        if (!this.globalData.showLoading){
            return ;
        }

        if (!this.loadingIsOpen){
            this.loadingIsOpen = true;
            this.loading = this.loadingCtrl.create({
                content:content
            });
            this.loading.present();
            setTimeout(() => { // 最长显示15s
                this.loadingIsOpen && this.loading.dismiss();
                this.loadingIsOpen = false;
            },15000);
        }
    }

    /**
     * 关闭loading
     */
    hideLoading():void {
        if (!this.globalData.showLoading){
            this.globalData.showLoading = true;
        }
        this.loadingIsOpen && this.loading.dismiss();
        this.loadingIsOpen = false;
    }
}

该服务中依赖了一些Cordova插件,别忘记导入
该文件中导入了 GlobalData 服务,所以还要新建该服务。

新建一个GlobalData全局变量设置类服务

GlobalData.ts

/**
 * Created by Void on 2017/7/14.
 * 保存全局的一些数据,和单例的设置
 */

import { Injectable } from '@angular/core';

@Injectable()
export class GlobalData{

    private _showLoading:boolean = true;

    get showLoading(): boolean {
        return this._showLoading;
    }

    set showLoading(value: boolean) {
        this._showLoading = value;
    }
}
HttpService的使用
  1. app.module.ts中引入HttpService和HttpModule

import {HttpModule} from '@angular/http';
import { HttpService } from '../providers/HttpService';
import { NativeServiceC } from '../providers/NativeServiceC';
import { GlobalData } from '../providers/GlobalData';

imports: [HttpModule],
providers: [
    StatusBar,
    SplashScreen,
    Network,
    HttpService,
    NativeServiceC,
    GlobalData,
    {provide: ErrorHandler, useClass: IonicErrorHandler}
  ]
  1. 在某一个页面的组件中使用

import {HttpService} from '../../providers/HttpService';
import {NativeServiceC} from "../../providers/NativeServiceC";
import {GlobalData} from "../../providers/GlobalData";

constructor(public navCtrl:NavController,
                private httpService:HttpService,
                private nativeService:NativeServiceC,
                private globalData:GlobalData) { }

// 本次请求不显示loading, 默认显示
this.globalData.showLoading = false; 

this.httpService.get(url, sender).subscribe(res => {
            // 隐藏loading,所有请求结束后都必须手动隐藏,不会自动隐藏。
            this.nativeService.hideLoading();
            console.log(res);
        })
结束
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 创建http 此篇博文已旧,新版看这里 第一步在src根目录新建一个providers文件夹,在这个文件夹新建一个...
    昵称已被使用_阅读 10,540评论 27 8
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 成长要自己去发现! 慢慢来,慢慢享受! 妈妈在你身后给你最大的保护! 爱你❤️宝贝!
    Era_0309阅读 297评论 0 0