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')
angular 封装http请求、解决跨域问题的更多相关文章
- 前端笔记之服务器&Ajax(下)数据请求&解决跨域&三级联动&session&堆栈
一.请求后端的JSON数据 JSON是前后端通信的交互格式,JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. JSON是互联网各个后台与 ...
- axios向后端请求解决跨域问题
我要向后端的请求的url是 http://192.168.3.25/ productInfo/insert 我是先用niginx转成localhost:8081 找conf/ nginx.conf , ...
- django中解决跨域问题
-跨域问题 -浏览器的:同源策略,浏览器拒绝不是当前域域返回的数据 -ip地址和端口号都相同才是同一个域 -如何解决: -CORS:跨域资源共享 -简单请求:发一次请求 -非简单请求:非简单请求是发送 ...
- 基于 HTTP 请求拦截,快速解决跨域和代理 Mock
近几年,随着 Web 开发逐渐成熟,前后端分离的架构设计越来越被众多开发者认可,使得前端和后端可以专注各自的职能,降低沟通成本,提高开发效率. 在前后端分离的开发模式下,前端和后端工程师得以并行工作. ...
- 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题
[手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...
- js中ajax如何解决跨域请求
js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...
- Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题
webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...
- 前后端分离djangorestframework——解决跨域请求
跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...
- XMLHttpRequest.withCredentials 解决跨域请求头无Cookie的问题
查看原文 XMLHttpRequest.withCredentials 属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization headers(头部授权)或者 ...
- NODE中解决跨域请求的问题
1.Node Express 解决请求跨域请求 标签(空格分隔): 跨域 1是Access-Control-Allow-Origin 允许的域 2是Access-Control-Allow-Heade ...
随机推荐
- 1.5 HDFS分布式文件系统-hadoop-最全最完整的保姆级的java大数据学习资料
目录 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 1.5.2 HDFS的重要概念 1.5.3 HDFS架构 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 HDFS(全称: ...
- DOM(原生js事件绑定)
一:原生js事件绑定 1.开关灯案例 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Python 大数据量文本文件高效解析方案代码实现
大数据量文本文件高效解析方案代码实现 测试环境 Python 3.6.2 Win 10 内存 8G,CPU I5 1.6 GHz 背景描述 这个作品来源于一个日志解析工具的开发,这个开发过程中遇到的一 ...
- anaconda peompt 、labalimg 数据标注
安装anaconda,进行数据标注 1.安装前准备:下好安装包和所需文件 https://www.aliyundrive.com/s/XyH2JQ5TjCz 提取码: 3c2w 2.运行anacond ...
- eclipse启动一个Springboot项目
1.准备一个Springboot项目 2.配置好maven 注:本地的maven-repository默认路径是在系统盘的.m文件夹.如果想要修改可参考: eclipse修改maven仓库的位置_本本 ...
- 【博学谷学习记录】超强总结,用心分享|前端开发HTML知识总结
HTML知识总结 字体加粗标签 注释快捷键 Ctrl + / 代码后缩进:shift + tad 1HTML标签 1.1排版标签介绍 1.1.1标题标签 <h1>1级标题<h1/&g ...
- Amber22 安装过程miniconda报错处理
最近在安装amber22时,使用其官方说明安装,但在安装miniconda这一步出错,致使amber22安装不成功! 报错如下: CondaFileIOError: '/home/lbm/amber2 ...
- 【Redis 技术探索】「数据迁移实战」手把手教你如何实现在线 + 离线模式进行迁移Redis数据实战指南(离线同步数据)
离线迁移 与在线迁移相比,离线迁移适宜于源实例与目标实例的网络无法连通的场景,或者源端实例部署在其他云厂商Redis服务中,无法实现在线迁移. 存在的问题 由于生产环境的各种原因,我们需要对现有服务器 ...
- 【原创】项目六 Load Of The Root
实战流程 新创建文件夹,在这个文件夹里进行操作 nmap扫描下网段 根据nmap逐个排查,发现目标主机,但只有22端口 因此进一步扫描22端口的具体信息,没有扫出很有用的信息 发现靶场又提示一个用户, ...
- 练习_使用递归计算1-n之间的和-练习_使用递归计算阶乘
练习_使用递归计算1-n之间的和 定义一个方法,使用递归计算1-n之间的和 1+2+3+. . .+n n+(n-1)+(n-2)+...+1 已知: 最大值:n 最小值:1 使用递归必须明确: 1. ...