第一部分:封装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全栈工程师之从网页搭建入门到Flask全栈项目实战(4) - Flask模板语法与继承

    1.Flask模板介绍 前置:理解渲染机制即上篇笔记中render_template()功能是如何实现的! 1)找到html文件地址 2)读取html文件中的内容 3)替换html中的特殊字符 4)将 ...

  2. C# 操作IIS加强版(添加,删除,启动,暂停网站,默认页,绑定信息)

    C# 操作IIS加强版(添加,删除,启动,暂停网站,默认页,绑定信息) 主要功能如下 在本机的IIS创建Web网站 删除网站包括应用程序池 删除应用程序池 添加默认文档 删除默认文档 添加虚拟目录 删 ...

  3. 从稍微懂一点开始的C++学习之路1: 智能指针

    从稍微懂一点开始的C++学习之路1 智能指针 因为之前一直是搞qt的,没有搞过纯c++,所以现在算得上是刚开始学纯C++.C++的大部分语法其实我都懂,主要的是一些规范,还有内存回收等一些细节地方纯C ...

  4. day06-功能实现05

    家居网购项目实现05 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 12.功能11-后台分页(分页显示家居) 12.1需求分析 ...

  5. Clickhouse表引擎探究-ReplacingMergeTree

    作者:耿宏宇 1 表引擎简述 1.1 官方描述 MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中.数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合 ...

  6. 关于RESTful 的使用(实战)

    今天在博客园首页看到一篇关于写 RESTful, 大致就是前端定义的一种规范. 原文如下, https://www.cnblogs.com/zhangmumu/p/11936262.html 看了一圈 ...

  7. CH565/CH569W ETH-MAC例程现象使用说明

    ETH-GMAC例程 使用MounRiver Studio(MRS)打开工程. 点击编译按键,编译完成出现0错误,0警告. 打开WCHISPTOOLS,芯片型号选择CH569或者CH565(根据评估版 ...

  8. Vue前后端分离实现登录的一个简单demo

    1.建立一个Maven项目,并添加Spring相关依赖 2.编写Controller类相应的接口和配置类 LoginController类,编写接口的业务逻辑 package com.springbo ...

  9. [python] ​python-pinyin库

    python-pinyin库是一个汉字拼音转换工具,其主要功能有: 根据词组智能匹配最正确的拼音. 支持多音字. 简单的繁体支持, 注音支持. 支持多种不同拼音风格. 安装命令为:pip instal ...

  10. [编程基础] Python谷歌翻译库googletrans总结

    1 使用说明 本文介绍python谷歌翻译库接口googletrans的使用.具体见官方文档: https://py-googletrans.readthedocs.io/en/latest/#goo ...