【Appetite】ionic3實錄(五)基本服務(wù)實現(xiàn)

寫了幾節(jié)UI方面的內(nèi)容复唤,有點累了吧杂穷?這節(jié)先換點別的東西寫擎淤。

前面章節(jié)基本把應(yīng)用的總體配置完成了脑漫,開始進入具體頁面的開發(fā),而這些離不開與數(shù)據(jù)的交互袋坑、與用戶的反饋操作等仗处。正所謂“兵馬未動,糧草先行”,現(xiàn)在封裝下基本的服務(wù)婆誓。

前面章節(jié)我們都是用命令行來操作咒精,如ionic g page person,現(xiàn)在開始會涉及到很多命令操作旷档,可能有些人會記不住命令,或者記不清關(guān)鍵字歇拆,可以像我這樣鞋屈,在IDE上裝上插件,我這用的是VS Code故觅,裝了插件后厂庇,src目錄右鍵會出現(xiàn)Ionic Generate的快捷菜單,點擊后彈出選擇界面输吏,輸入名稱即可自動創(chuàng)建权旷。
關(guān)于IDE插件的,可以查看我另一篇文章開發(fā)工具插件贯溅。

image.png

image.png

TypeScript中拄氯,public為默認(rèn)訪問級別,即外部可以訪問的它浅,所以如果想控制權(quán)限译柏,請手動添加private關(guān)鍵字。常規(guī)應(yīng)用姐霍,一般會有通用服務(wù)和具體業(yè)務(wù)服務(wù)鄙麦,而常用的通用服務(wù)有如下幾個:

一、全局設(shè)置服務(wù)

ionic g provider config

import { Injectable } from '@angular/core';
import { Headers, RequestOptions } from '@angular/http';
import 'rxjs/add/operator/map';

@Injectable()
export class ConfigProvider {

  constructor() {
  }

   /**
   * 獲取域名
   * @param versionType 版本類型镊折,0:正式環(huán)境胯府,1:測試環(huán)境,2: 本地
   */
  static getDomainInfo(versionType: number = 1): any{
    let domain: string;
    switch(versionType){
      case 0: domain = "http://"; break;  //正式環(huán)境
      case 1: domain = "http://"; break;    //測試環(huán)境
      case 2: domain = ""; break;    //本地
      default: domain = ""; break;
    }
    return {domain: domain, versionType: versionType};
  }

  /**
   *獲取api地址
   */
  static getApiHost(){
      return ConfigProvider.getDomainInfo().domain + "";
  }

  static defaultHeaders = new Headers({'Content-Type': 'application/json', 'Accept': 'application/json'});
  static formHeaders = new Headers({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': 'application/json'});
  static uploadHeasers = new Headers({'Content-Type': 'multipart/form-data'});
  //
  static defaultOptions = new RequestOptions({headers: ConfigProvider.defaultHeaders});
  static formOptions = new RequestOptions({headers: ConfigProvider.formHeaders});
  static uploadOptions = new RequestOptions({headers: ConfigProvider.uploadHeasers});

}

因為有時需要在幾個環(huán)境切換服務(wù)地址恨胚,所以寫一個方法方便切換地址骂因;
另外angular默認(rèn)使用application/json的請求頭,有時我們需要根據(jù)后臺接口來配置請求頭与纽,在這就預(yù)先配置幾個常用的RequestOption侣签,方便按需要隨時切換。

二急迂、網(wǎng)絡(luò)請求服務(wù)

ionic g provider common

import 'rxjs/add/operator/retry';
import 'rxjs/add/operator/timeout';
import 'rxjs/add/operator/delay';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';

import { Headers, Http, RequestOptions } from '@angular/http';

import { ConfigProvider } from './config';
import { Injectable } from '@angular/core';

//處理過的響應(yīng)數(shù)據(jù)
export interface IResponseData<T> {
  success: boolean;
  msg: string;
  code?: number;
  result?: T;      //響應(yīng)數(shù)據(jù)
}

@Injectable()
export class CommonProvider {

  constructor(public authHttp: Http) {    
  }

  /**
   * get方法(isJoinHost是為了兼容獲取應(yīng)用內(nèi)部數(shù)據(jù))
   * @param url 請求url
   * @param isJoinHost 是否合并到主機地址
   */
  get(url: string, isJoinHost: boolean = true) {
    url = (isJoinHost && url.indexOf('http') <0) ?  ConfigProvider.getApiHost() + encodeURI(url) : encodeURI(url);
    return this.authHttp.get(url)
      .timeout(60000)
      .toPromise()
      .then(result => result.json())
      .catch(resp => this.handleHttpError(resp));
  }

  /**
   * post方法
   * @param url 請求url
   * @param data 請求參數(shù)
   * @param options 請求選項
   */
  post(url: string, data: any = {}, options: RequestOptions = ConfigProvider.formOptions) {
    url = url.indexOf('http') > -1 ? url : ConfigProvider.getApiHost() + url;
    return this.authHttp.post(url, data, options)
      .timeout(60000)
      .toPromise()
      .then(result => result.json())
      .catch(resp => this.handleHttpError(resp));
  }

 /**
 * 處理http錯誤
 */
  handleHttpError(resp): IResponseData<any> {
    let errMsg = '抱歉影所,后臺服務(wù)出錯了';
    if (resp) {
      let msg: string = resp.message;
      if (msg && msg.toLowerCase().indexOf('timeout') > -1) {
        errMsg = '請求超時,請稍后重試僚碎!';
      } else {
        switch (resp.status) {
          case 401: errMsg = '無權(quán)限訪問猴娩,或許登錄信息已過期,請重新登錄';
          case 404: errMsg = '抱歉,后臺服務(wù)找不到對應(yīng)接口';
          case 0: errMsg = '網(wǎng)絡(luò)無法連接';
          default: break;
        }
      }
    }
    return { success: false, msg: errMsg, code: -1, result: null};
  }
}

這里只簡單的封裝了帶超時和錯誤處理的get卷中、post方法矛双。因為數(shù)據(jù)接口服務(wù)往往不會只返回數(shù)據(jù),還應(yīng)帶有請求信息蟆豫,如獲取數(shù)據(jù)為空议忽,可以提示是系統(tǒng)問題、權(quán)限問題還是數(shù)據(jù)本就這樣十减,所以封裝了統(tǒng)一響應(yīng)數(shù)據(jù)接口栈幸。

因為目前大多插件的異步使用Promise,Observable轉(zhuǎn)Promise比較簡單帮辟,而Promise轉(zhuǎn)Observable比較麻煩速址,為了更方便集成,所以把官方推薦的Observable方式轉(zhuǎn)成Promise方式由驹,大家可基于Observable優(yōu)點考慮仍沿用Observable也行芍锚。

注意catch里面用了return,表示捕獲了異常處理并返回蔓榄,下次鏈?zhǔn)秸{(diào)用將進入then并炮,這樣每個調(diào)用網(wǎng)絡(luò)請求后的邏輯操作可以全放在then里,省掉寫catch的部分润樱。要想下次鏈?zhǔn)秸{(diào)用再處理異常渣触,就應(yīng)用Promise.reject繼續(xù)拋出異常。

三壹若、權(quán)限服務(wù)

ionic g provider auth

先建個文件備用嗅钻。

四、緩存服務(wù)

ionic g provider cache

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
import { Storage } from '@ionic/storage';

/**
 * 用枚舉管理key值店展,防止字符串拼錯
 */
export enum CacheKeys {
  TOKEN, AUTO_LOGIN, USER_INFO
}

@Injectable()
export class CacheProvider {

  constructor(public http: Http, public storage: Storage) {
    console.log(CacheKeys[CacheKeys.TOKEN]);
  }
}

因為key使用字符串方式养篓,不容易記憶使用,也容易敲錯赂蕴,為了便于管理Key柳弄,用枚舉來處理。后續(xù)補充結(jié)合http的緩存請求概说。

五碧注、工具服務(wù)

ionic g provider util

import 'rxjs/add/operator/map';
import { DomSanitizer } from '@angular/platform-browser';
import { Injectable } from '@angular/core';
/*
  工具類
  Generated class for the UtilProvider provider.
*/
@Injectable()
export class UtilProvider {

  constructor(private sanitizer: DomSanitizer) {
  }

 /**
   * 深拷貝
   */
  deepCopy(originObj: any): any{
    return originObj ? JSON.parse(JSON.stringify(originObj)) : null;
  }

  /**
   * 處理html的安全信任
   * @param html raw html
   */
  sanitizeHtml(html: string): any{
    return this.sanitizer.bypassSecurityTrustHtml(html);
  }
}

先實現(xiàn)兩個應(yīng)該要用到的方法,待后續(xù)實現(xiàn)功能時再擴展糖赔。

這些服務(wù)會隨著業(yè)務(wù)功能的開發(fā)而補充萍丐,服務(wù)的每個方法可以不寫返回類型(如fun: Promise<any>里的 Promise<any>),但為了肉眼快速分辨出是異步方法還是普通方法放典?返回參數(shù)是什么類型逝变?我習(xí)慣了書寫基茵。

晚了,先寫到這里壳影。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拱层,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宴咧,更是在濱河造成了極大的恐慌根灯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掺栅,死亡現(xiàn)場離奇詭異箱吕,居然都是意外死亡,警方通過查閱死者的電腦和手機柿冲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兆旬,“玉大人假抄,你說我怎么就攤上這事±鲡” “怎么了宿饱?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脚祟。 經(jīng)常有香客問我谬以,道長,這世上最難降的妖魔是什么由桌? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任为黎,我火速辦了婚禮,結(jié)果婚禮上行您,老公的妹妹穿的比我還像新娘铭乾。我一直安慰自己,他們只是感情好娃循,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布炕檩。 她就那樣靜靜地躺著,像睡著了一般捌斧。 火紅的嫁衣襯著肌膚如雪笛质。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天捞蚂,我揣著相機與錄音妇押,去河邊找鬼。 笑死洞难,一個胖子當(dāng)著我的面吹牛舆吮,可吹牛的內(nèi)容都是我干的揭朝。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼色冀,長吁一口氣:“原來是場噩夢啊……” “哼潭袱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锋恬,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤屯换,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后与学,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤悔,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年索守,在試婚紗的時候發(fā)現(xiàn)自己被綠了晕窑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡卵佛,死狀恐怖杨赤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情截汪,我是刑警寧澤疾牲,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站衙解,受9級特大地震影響阳柔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚓峦,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一舌剂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暑椰,春花似錦架诞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至角虫,卻和暖如春沾谓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戳鹅。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工均驶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枫虏。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓妇穴,卻偏偏與公主長得像爬虱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腾它,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理跑筝,服務(wù)發(fā)現(xiàn),斷路器瞒滴,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,860評論 25 707
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持曲梗,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠妓忍,并抽取幸運大...
    HetfieldJoe閱讀 8,677評論 0 29
  • 特別說明虏两,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 647評論 0 3
  • 此刻世剖,快走完3圈定罢,腳在發(fā)軟,但卻吸收到沁人心脾的空氣旁瘫,嗯引颈,我愛上快走,不是因為快走本身境蜕,而且因為這里有清涼的空氣。...
    美鳳的打怪日記閱讀 353評論 0 0