angular 封装http请求、解决跨域问题
2024-09-08 13:45:17
第一部分:封装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')
最新文章
- SQL SERVER 9003错误解决方法 只适用于SQL2000
- C/C++内存分配
- 【emWin】例程四:显示文本
- Pycharm快捷方式
- A session of Log Collect, Retrieval and Analysis using ELK Stack
- motto1
- HDU 1043 &; POJ 1077 Eight(康托展开+BFS+预处理)
- Oracle笔记 十、PL/SQL存储过程
- python二叉树递归算法之后序遍历,前序遍历,中序遍历
- Android中BaseAdapter的基本用法和加载自定义布局!
- 为编写网络爬虫程序安装Python3.5
- Nginx 常用配置整理
- Jenkins构建本地项目到服务器上自动部署的方法
- spark在yarn-cluster模式,错误查找方法
- 关于redis的使用
- JavaScript引用类型之Array类型API详解
- 小数点保留n位有效数字
- IDEA常用快捷键总结
- no-sql数据库之redis
- 会话session