angular 封装http请求、解决跨域问题

第一部分:封装http请求

1.定义 ResultDataModel

export interface ResultDataModel<T> {
    success: boolean;
    errCode: number;
    message: string;
    data: T;
    pageModel: PageModel;
}

export interface PageModel {
    pageIndex: number;
    pageSize: number;
    pageCount: number;
    totalNum: number;
    totalPage: number;
}

2.定义 QueryModel

export class QueryModel {
    items: QueryItem[];
    page: QueryPage;
    constructor() {
        this.items = [];
        this.page = new QueryPage();
    }
    setItems(key: string, value: string) {
        this.items.push({ key: key, value: value });
    }
    setPage(pageIndex: number, pageSize: number, pageCount: number) {
        this.page.pageIndex = pageIndex;
        this.page.pageSize = pageSize;
        this.page.pageCount = pageCount;
    }
}
export class QueryItem {
    key: string;
    value: string;
    constructor() {
        this.key = this.value = ''
    }
}
export class QueryPage {
    pageIndex: number;
    pageSize: number;
    pageCount: number;
    constructor() {
        this.pageIndex = this.pageSize = this.pageCount = 0
    }
}

3.书写自定义http服务,命名为vhttp

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { ResultDataModel } from '../model/ResultDataModel';
import { catchError } from 'rxjs/operators';
import { QueryModel } from '../model/QueryModel';
@Injectable({
  providedIn: 'root'
})
export class VhttpService {

  constructor(public http: HttpClient) { }

  get(url: string, token?: string): Observable<ResultDataModel<any> | null> {
    let _token: string = '';
    if (token)
      _token = token
    let header: HttpHeaders = new HttpHeaders({
      Authorization: _token
    });
    // header.set('Authorization', token); 不能这么写
    return this.http.get<ResultDataModel<any>>(url, { headers: header })
      .pipe(
        catchError(res => {
          console.log(res);
          return of(null);
        }),
        // map((res: ResultDataModel<any>) => {
        //   if (!res.success) {
        //     console.log(res?.message)
        //     throwError(res?.message)
        //   }
        //   return res
        // })
      );
  }

  post(url: string, query?: QueryModel, token?: string): Observable<ResultDataModel<any> | null> {
    //header
    let _token: string = '';
    if (token)
      _token = token
    let header: HttpHeaders = new HttpHeaders({
      Authorization: _token
    });
    return this.http.post<ResultDataModel<any>>(url, query, { headers: header })
      .pipe(
        catchError(res => {
          console.log(res);
          return of(null);
        }),
      );
  }
}

  使用看看

    this.vhttp.get('/api' + '/jwt/ceshi2', token)
      .pipe(
        map(res => {
          if (!res) {
            console.log('!res')
            return
          }
          if (!res.success) {
            console.log('!res?.success')
            return
          }
          return res.data
        })
      )
      .subscribe(res => console.log(res));


    let query: QueryModel = new QueryModel();
    query.setItems('sex','');
    query.setItems('id','001');
    query.setPage(1,10,1);
    this.vhttp.post('/api' + '/jwt/ceshi3', query, token)
      .pipe(
        map(res => {
          if (!res) {
            console.log('!res')
            return
          }
          if (!res.success) {
            console.log('!res.success')
            return
          }
          return res.data
        })
      )
      .subscribe(res => console.log(res));

第二部分:

1.添加配置文件 proxy.conf.json (最外层,和src同级)

{
    "/api": {
        "target": "http://localhost:1111",
        "secure": false,

        "changeOrigin": true,
        "logLevel": "debug"
    }
}

  在 angular.json 添加 proxyConfig 配置,位置如下

        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "MyFirstDemo:build",
            "proxyConfig": "proxy.conf.json"
          },

  重新启动程序

启动项目命令:ng serve --proxy-config proxy.conf.json
尝试过:ng serve --open 也是可以的

  可以在改写 package.json,使用 npm start 启动项目

"start": "ng serve --proxy-config proxy.conf.json"

  会将  http://localhost:4200/api  的地址进行转换,如

http://localhost:4200/api/jwt/ceshi2
会转换为
http://localhost:1111/api/jwt/ceshi2

  在输入url时,可省略 http://localhost:4200 只需要从 /api 开始,会自动补全

第三部分:

  这样解决跨域并不稳妥,涉及多个api地址不好弄,最好的解决办法是取消后台跨域限制

  因为这篇是angular ,这里就不纤细说明怎么取消,另附随笔: net core 添加cors,解决跨域问题

  然后,写配置文件

  

   代码如下:

export interface ApplicationConfig {
  vpart: string;
}

export const CONFIG: ApplicationConfig = {
  vpart: 'http://10.163.101.252:1103/api'
};

  调用:

import { CONFIG } from 'src/config/api.config';
return this.vhttp.get(CONFIG.vpart+'url')

  

原文地址:https://www.cnblogs.com/wskxy/p/14260591.html