angular-http-baseService

茅华灿
2023-12-01

登录密码错误:
res.status=200;status_code=550,status_msg=‘密码错误’;=》首先进入then(success)里面,然后再判断是否ok。
404:403,401也是这个情况。
res.status=404,==》进入了catch里面。
// 401的时候,自动清除了cookie里的信息;
403的时候,并没有

其中:res.status即General里面的Status Code,status_code指Response Headers里面的status_code

注:不同浏览器里,大小写可能不同的。eg:

status_msg   和    Status_msg

=>查看不同浏览器的时候,发现ie报错;修改polyfill.ts,并安装依赖。

  • base64
import '../widget/script/base64.js';

declare var Base64: any;

或者:
参考:https://www.npmjs.com/package/js-base64

// 安装
npm install --save js-base64

// 导入
import { Base64 } from 'js-base64';

// 使用:
Base64.encode('abc');  // YWJj

constructor:

constructor(public http: HttpClient,
              public router: Router,) {
  }

基本方法:

public jsonCall(data, url, type):any {
  console.log(this.http);
  console.log('jsonCall执行了');
  return new Promise((resolve, reject) => {
    if (type === 'get' || type === 'delete') {
      console.log('http:', this.http);
      this.http[type](url, {
        headers: new HttpHeaders({
          currentA: 'AAA',
          currentB: 'BBB'
        }),
        observe: 'response',
        params: data
      })
        .toPromise()
        .then(res => {
          console.log('get-then里面的res:', res);
          if (res.status === 200) {
            this.handleSuccess(resolve, reject, res);
          }
        })
        .catch(res => {
          console.log('get-catch里面的res:', res);
          this.handleError(resolve, reject, res);
        });
    } else {
      this.http[type](url, data, {
        headers: new HttpHeaders({
          currentA: 'AAA-post',
          currentB: 'BBB-post'
        }),
        observe: 'response',
        params: {ksName: 'ks'}, // 这样也会拼接在url后面(我们的分页就是这种情况)
      })
        .toPromise()
        .then(res => {
          console.log('post-then里面的res:', res);
          if (res.status === 200) {
            this.handleSuccess(resolve, reject, res);
          }
        })
        .catch(res => {
          console.log('post-catch里面的res:', res);
          this.handleError(resolve, reject, res);
        });
    }
  });
}

success:

handleSuccess(resolve, reject, res) {
  console.log('进入success里面');
  const status_code = res.headers.get('status_code'); // 若果没有,那么值为null
  const totalNum = res.headers.get('x-total-count'); // 如果没有,那么值为null
  //  其中: null==undefined :true;    null==null :true
  //        null===undefined :false;   null===null :true
  console.log('status_code:', status_code, 'totalNum:', totalNum);
  if (status_code == 200 || !status_code) { // status_code返回为数值型,但是get以后,变为字符型;所以没用===
    if (totalNum !== null) {
      // 分页的情况
      console.log('有分页的情况');
      resolve({data: res.body, total: totalNum || 0});
    } else {
      console.log('没有分页的情况');
      console.log('body是不是json格式的:', res.body);
      resolve(res.body || null);
    }
  } else {
    console.log(Base64);
    const status_msg = res.headers.get('status_msg');
    const error_msg = new Base64().decode(status_msg);
    resolve({error_msg: error_msg, error_code: status_code});
  }
}

error:

handleError(resolve, reject, res) {
  console.log('handleError的情况:', res);
  if (!!res && res.status === 401) {
    // 登出
    this.logout();
    console.log('401的情况');
    return;
  }
  if (!!res && res.status === 404) {
	resolve({error_msg: 'not found'});
    return;
  }
  let error_msg = '服务异常-ksbk';
  const status_msg = res.headers.get('status_msg'); // || '服务异常-ksbk'
  if (!!status_msg) {
    error_msg = new Base64().decode(status_msg);
  }
  resolve({error_msg: error_msg});
}

// logout
logout(){
	AppCommon.userInfo = null;
	this.router.navigate(['gyauth/login']); // 401的时候,cookie里面的信息自动已经清除了。

}

// 接口里的错误提示:

// 错误信息
if (!!res && !!res.error_msg) {
 this.nzMessageService.create('error', res.error_msg);
  return;
}

编译ng build --prod报错:

error TS2339: Property 'error_msg' does not exist on type '{}'.

修改res.error_msgres['error_msg'];接口正确 的时候,返回的res没有error_msg,所以不用"."的语法。

使用时候的报错:

// 使用:
this.roleList = res.data || []; // build报错
this.roleList = res['data'] || []; // ok

res.length  // 报错???
res['length']  // ok
// 这是为什么?
// 报错内容:
error TS2339: Property 'data' does not exist on type '{}'.
error TS2339: Property 'length' does not exist on type '{}'. // 其实我返回的就是数组啊???
res.length  // 报错???修改为:
const list: any = res || [];
list.length   // ok了,使用变量转换一下(any)。

==》以上语法报错的原因:归根到底,使用:jsonCall返回类型为any,那么就一切ok了。

 public jsonCall(data: any, url, type): any {}


另外可以加上:

handleSuccess(resolve, reject, res?: any) {}
handleError(resolve, reject, res?: any) {}
 类似资料: