ionic2(仿單糖app)-04網(wǎng)絡請求封裝

主要內(nèi)容

  • http get 請求
  • http post 請求
  • 全局的工具類
新建一個http請求類服務

HttpService.ts

/**
 * Created by Void on 2017/7/13.
 *
 *  網(wǎng)絡請求服務類
 */

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


    /**
     * 將對象轉(zhuǎn)為查詢參數(shù)
     * @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 = '請求發(fā)生異常', status = err.status;
        if (!this.nativeService.isConnecting()) {
            msg = '請求失敗,請連接網(wǎng)絡';
        } else {
            if (status === 0) {
                msg = '請求失敗,請求響應出錯';
            } else if (status === 404) {
                msg = '請求失敗分飞,未找到請求地址';
            } else if (status === 500) {
                msg = '請求失敗血久,服務器出錯,請稍后再試';
            }
        }
        this.alertCtrl.create({
            title: msg,
            subTitle: '狀態(tài)碼:' + 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.
 *
 *  調(diào)用手機硬件的類
 *
 * 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();
    }

    /**
     * 統(tǒng)一調(diào)用此方法顯示loading
     * @param content 顯示的內(nèi)容
     */
    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.
 * 保存全局的一些數(shù)據(jù)它碎,和單例的設置
 */

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函荣,所有請求結(jié)束后都必須手動隱藏,不會自動隱藏扳肛。
            this.nativeService.hideLoading();
            console.log(res);
        })
結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傻挂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挖息,更是在濱河造成了極大的恐慌金拒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套腹,死亡現(xiàn)場離奇詭異绪抛,居然都是意外死亡,警方通過查閱死者的電腦和手機沉迹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門睦疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鞭呕,你說我怎么就攤上這事蛤育。” “怎么了葫松?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵瓦糕,是天一觀的道長。 經(jīng)常有香客問我腋么,道長咕娄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任珊擂,我火速辦了婚禮圣勒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摧扇。我一直安慰自己圣贸,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布扛稽。 她就那樣靜靜地躺著吁峻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上用含,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天矮慕,我揣著相機與錄音,去河邊找鬼啄骇。 笑死痴鳄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肠缔。 我是一名探鬼主播夏跷,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼明未!你這毒婦竟也來了槽华?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趟妥,失蹤者是張志新(化名)和其女友劉穎猫态,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體披摄,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡亲雪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疚膊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片义辕。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寓盗,靈堂內(nèi)的尸體忽然破棺而出灌砖,到底是詐尸還是另有隱情,我是刑警寧澤傀蚌,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布基显,位于F島的核電站,受9級特大地震影響善炫,放射性物質(zhì)發(fā)生泄漏撩幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一箩艺、第九天 我趴在偏房一處隱蔽的房頂上張望窜醉。 院中可真熱鬧,春花似錦艺谆、人聲如沸榨惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春撒妈,著一層夾襖步出監(jiān)牢的瞬間恢暖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工狰右, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杰捂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓棋蚌,卻偏偏與公主長得像嫁佳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谷暮,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蒿往,服務發(fā)現(xiàn),斷路器湿弦,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法瓤漏,類相關的語法,內(nèi)部類的語法颊埃,繼承相關的語法蔬充,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 創(chuàng)建http 此篇博文已舊,新版看這里 第一步在src根目錄新建一個providers文件夾,在這個文件夾新建一個...
    昵稱已被使用_閱讀 10,548評論 27 8
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • 成長要自己去發(fā)現(xiàn)班利! 慢慢來饥漫,慢慢享受! 媽媽在你身后給你最大的保護罗标! 愛你??寶貝庸队!
    Era_0309閱讀 300評論 0 0