第一部分:封装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请求、解决跨域问题的更多相关文章

  1. 前端笔记之服务器&Ajax(下)数据请求&解决跨域&三级联动&session&堆栈

    一.请求后端的JSON数据 JSON是前后端通信的交互格式,JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. JSON是互联网各个后台与 ...

  2. axios向后端请求解决跨域问题

    我要向后端的请求的url是 http://192.168.3.25/ productInfo/insert 我是先用niginx转成localhost:8081 找conf/ nginx.conf , ...

  3. django中解决跨域问题

    -跨域问题 -浏览器的:同源策略,浏览器拒绝不是当前域域返回的数据 -ip地址和端口号都相同才是同一个域 -如何解决: -CORS:跨域资源共享 -简单请求:发一次请求 -非简单请求:非简单请求是发送 ...

  4. 基于 HTTP 请求拦截,快速解决跨域和代理 Mock

    近几年,随着 Web 开发逐渐成熟,前后端分离的架构设计越来越被众多开发者认可,使得前端和后端可以专注各自的职能,降低沟通成本,提高开发效率. 在前后端分离的开发模式下,前端和后端工程师得以并行工作. ...

  5. 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题

    [手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...

  6. js中ajax如何解决跨域请求

    js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...

  7. Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题

        webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...

  8. 前后端分离djangorestframework——解决跨域请求

    跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...

  9. XMLHttpRequest.withCredentials 解决跨域请求头无Cookie的问题

    查看原文 XMLHttpRequest.withCredentials  属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization headers(头部授权)或者 ...

  10. NODE中解决跨域请求的问题

    1.Node Express 解决请求跨域请求 标签(空格分隔): 跨域 1是Access-Control-Allow-Origin 允许的域 2是Access-Control-Allow-Heade ...

随机推荐

  1. python自然语言处理(NLP)1------中文分词1,基于规则的中文分词方法

    python中文分词方法之基于规则的中文分词 目录 常见中文分词方法 推荐中文分词工具 参考链接 一.四种常见的中文分词方法: 基于规则的中文分词 基于统计的中文分词 深度学习中文分词 混合分词方法 ...

  2. Bootstrap响应式相关

    bootstrap响应式布局实现原理:百分比布局+媒体查询  | 栅格系统 bootstrap和vue响应式布局的区别: 1. bootstrap 栅格系统,简,缺少组件 2. vue 速度快,组件多 ...

  3. 输出图形字符的命令 banner

    输出图形字符的命令 banner 有趣的 Linux 命令.来自实验楼操作系统课程 安装 sudo apt install sysvbanner 截图 其他 还有两个类似的命令toilet,figle ...

  4. 04.Javascript学习笔记3

    1.箭头函数 箭头函数是一种更短的函数表达式. const age = birthyear => 2022 - birthyear; console.log(age(2000)) 箭头左边的bi ...

  5. uni-app 动态修改主题色

    老是碰到初版制作完成没多久,就整一出说什么要更改整个项目的色彩体系.真的是宝宝心里苦啊! 起初都是通过uni项目自带的uni.scss中定义,在替换页面上对应的css.以便于达到一次性修改整体布局的样 ...

  6. uniapp详细入门教程

    链接:https://www.ruletree.club/archives/2071/ 点击链接查看,内容详细,一学就会哦~! /******** * * .-~~~~~~~~~-._ _.-~~~~ ...

  7. 如何自定义调整bootstrap的模态框大小

    背景 项目遇到一个需求,一个大表格放到模态框中,总是会出现撑开的效果,换了文档最大的modal-lg样式还不能解决,原因就是官方不支持更大号的模态框,需要自定义. 经过尝试理解,总结出调整模态框大小通 ...

  8. Python实验报告(第2章)

    实验2:Python语言基础 一.实验目的和要求 1.了解Python的编写规范要求: 2.了解Python的基本数据类型: 3.学会使用Python的五种运算符: 4.掌握Python的基本输入和输 ...

  9. 道长的算法笔记:KMP算法及其各种变体

    (一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 \(next\) 数组,\(next[i]=j\) 代表 \(p[1,j]=p[i-j+1,i]\),\(nex ...

  10. python之路33 MySQL 1

    存取数据的演变 1.文本文件 文件路径不固定:C:\aaa.txt D:\bbb.txt E:\ccc.txt 数据格式不统一:jason|123 jason$123 jason 123 2.软件开发 ...