ionic3 封装http请求、创建provider

在src文件下新建tool目录,新建httpService(自己命名)文件,在httpServeice下新建httpInterceptorService.ts

import {Injectable} from "@angular/core";
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from "@angular/common/http";
import {Observable} from "rxjs/Observable";
import {mergeMap, catchError, tap, finalize} from 'rxjs/operators';
import {Loading, LoadingController} from 'ionic-angular';
import {ErrorObservable} from 'rxjs/observable/ErrorObservable';

@Injectable()
export class HttpInterceptorService implements HttpInterceptor {
  private loading: Loading;
  status = {
    '0': '网络出了点小差哟,请稍后再试',
    '400': '错误的请求。由于语法错误,该请求无法完成。',
    '401': '未经授权。服务器拒绝响应。',
    '403': '已禁止。服务器拒绝响应。',
    '404': '未找到。无法找到请求的位置。',
    '405': '方法不被允许。使用该位置不支持的请求方法进行了请求。',
    '406': '不可接受。服务器只生成客户端不接受的响应。',
    '407': '需要代理身份验证。客户端必须先使用代理对自身进行身份验证。',
    '408': '请求超时。等待请求的服务器超时。',
    '409': '冲突。由于请求中的冲突,无法完成该请求。',
    '410': '过期。请求页不再可用。',
    '411': '长度必需。未定义“内容长度”。',
    '412': '前提条件不满足。请求中给定的前提条件由服务器评估为 false。',
    '413': '请求实体太大。服务器不会接受请求,因为请求实体太大。',
    '414': '请求 URI 太长。服务器不会接受该请求,因为 URL 太长。',
    '415': '不支持的媒体类型。服务器不会接受该请求,因为媒体类型不受支持。',
    '416': 'HTTP 状态代码 {0}',
    '500': '网络出了点小差哟,请稍后再试。',//内部服务器错误
    '501': '未实现。服务器不识别该请求方法,或者服务器没有能力完成请求。',
    '503': '服务不可用。服务器当前不可用(过载或故障)。'
  };

  constructor(private loadingCtrl: LoadingController) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const reqs = req.clone({
      // headers: req.headers.set('token',this.token)
    });
    // this.showLoading();
    return next.handle(reqs).pipe(
      tap(event => {
          if (event instanceof HttpResponse) {
          }
        }
      ),
      finalize(() => {
        // this.hideLoading();
      }),
      mergeMap((event: any) => {
        if (event instanceof HttpResponse && event.status != 200) {
          return ErrorObservable.create(event);
        }
        return Observable.create(observer => {
          observer.next(event)
        }); //请求成功返回响应
      }),
      catchError((res: HttpResponse<any>) => {  //请求失败处理
          if (res.status < 200 || res.status >= 300) {
            let msg = this.status[res.status];
            alert(msg)
          }
          return ErrorObservable.create(event);
        }
      )
    )
  }
  showLoading(content = ''): void {
    if (!this.loading) {// 如果loading已经存在则不再打开
      const loading = this.loadingCtrl.create({
      })
      loading.present();
      this.loading = loading;
    }
  }
  hideLoading(): void {
    this.loading && this.loading.dismiss();
    this.loading = null;
  }
}

在app.module.ts中引入HttpInterceptorService

创建provider封装http请求

ionic g provider my-http 会自动创建了一个名为my-http的服务在src/providers里

//my-http.ts
import { HttpClient, HttpParams ,HttpHeaders} from '@angular/common/http';
import { Injectable } from '@angular/core';
import { isObject } from "rxjs/util/isObject";
import { HOST_URL,ACCESS_TOKEN} from '../../domain/main';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
import {Loading, LoadingController} from "ionic-angular";
@Injectable()
export class MyHttpProvider {
  private loading: Loading;
  constructor(public http: HttpClient,
  private loadingCtrl: LoadingController) {
    
  }
  //带有token的get请求
  get(url: string, params: any, isShowLoading?:boolean, callback?: (res: any, error: any) => void): void {
    if (isShowLoading != null){
      if (isShowLoading){
        this.showLoading()
      }
    }
    let fullUrl = `${HOST_URL}${url}/${localStorage.getItem(ACCESS_TOKEN)}`;
    let headers = new HttpHeaders();
    // headers.append('Content-Type', 'application/json;utf-8');
    headers.append('token', localStorage.getItem(ACCESS_TOKEN));
    this.http.get(fullUrl, {params: this.encodeComplexHttpParams(params),
    headers:headers})
      .subscribe(res => {
        this.hideLoading()
        callback && callback(res, null);
      }, error => {
        this.hideLoading()
        callback && callback(null, error);
      });
  }
  //带有token的post请求
  post(url: string, params: any,isShowLoading?:boolean, callback?: (res: any, error: any) => void): void {
    if (isShowLoading != null){
      if (isShowLoading){
        this.showLoading()
      }
    }
    let fullUrl = `${HOST_URL}${url}/${localStorage.getItem(ACCESS_TOKEN)}`;
    let headers = new HttpHeaders();
    // headers.append('Content-Type', 'application/json;utf-8');
    headers.append('token', localStorage.getItem(ACCESS_TOKEN));
    console.log(localStorage.getItem(ACCESS_TOKEN))
    this.http.post(fullUrl, this.encodeComplexHttpParams(params),{
      headers:headers
    })
      .subscribe(res => {
          this.hideLoading()
          callback && callback(res, null);
      },
        error => {
          this.hideLoading()
          callback && callback(null, error);
        });
  }
//不带有token的get请求
  directGet(url: string, params: any,isShowLoading?:boolean, callback?: (res: any, error: any) => void): void {
    if (isShowLoading != null){
      if (isShowLoading){
        this.showLoading()
      }
    }
    let fullUrl = HOST_URL + url;
    this.http.get(fullUrl, { params: this.encodeComplexHttpParams(params) })
      .subscribe(res => {
        this.hideLoading()
        callback && callback(res, null);
      }, error => {
        this.hideLoading()
        callback && callback(null, error);
      });
  }
  //不带token的post请求
  directPost(url: string, params: any, isShowLoading?:boolean,callback?: (res: any, error: any) => void): void {
    if (isShowLoading != null){
      if (isShowLoading){
        this.showLoading()
      }
    }
    let fullUrl = HOST_URL + url;
    this.http.post(fullUrl, this.encodeComplexHttpParams(params))
      .subscribe(res => {
        this.hideLoading()
          callback && callback(res, null);
        },
        error => {
          this.hideLoading()
          callback && callback(null, error);
        });
  }
  private paramsString(params: any): string {
    if (!params) return null; let str = "";
    for (let key in params) {
      if (params.hasOwnProperty(key)) {
        let value = params[key];
        if (value === null) continue;
        if (Array.isArray(value)) {
          if (value.length === 0) continue;
          for (let index = 0; index < value.length; index++) {
            let k = key + "[" + index + "]"; let v = value[index];
            if (str.length > 1) str += "&"; str += k + "=" + v;
          }
        } else if (isObject(value)) {
          for (let subKey in value) {
            if (value.hasOwnProperty(subKey)) {
              let v = value[subKey];
              if (v === null) continue; let k = key + "[" + subKey + "]";
              if (str.length > 1) str += "&"; str += k + "=" + v;
            }
          }
        }
        else { if (str.length > 1) str += "&"; str += key + "=" + value; }
      }
    }
    return str;
  }
  private encodeComplexHttpParams(params: any): any {
    if (!params) return null;
    return new HttpParams({ fromString: this.paramsString(params) });
  }
  showLoading(content = ''): void {
    if (!this.loading) {
      const loading = this.loadingCtrl.create({
      })
      loading.present();
      this.loading = loading;
    }
  }
  hideLoading(): void {
    this.loading && this.loading.dismiss();
    this.loading = null;
  }
}
其中HOST_URL是domain目录下main.ts设置的后台api地址,ACCESS_TOKEN是登陆后的token。

使用前在app.modult.ts中引入MyHttpProvider

//app.module.ts
…………
import { MyHttpProvider} from '../providers/my-http/my-http';
…………
@NgModule({
  declarations: [
    MyApp,
    TabsPage,
  ],
  imports: [
    …………
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    TabsPage,
  ],
  providers: [
    …………
    MyHttpProvider
    …………
  ]
})
export class AppModule {
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值