跳到主要内容
版本:4.0.0 🚧

HTTP 代理

适用于 @midwayjs/faas@midwayjs/web@midwayjs/koa@midwayjs/express 多种框架的 HTTP 请求代理组件,支持 GET、POST 等多种请求方法。

相关信息:

web 支持情况
@midwayjs/koa
@midwayjs/faas💬
@midwayjs/web
@midwayjs/express
警告

💬 部分函数计算平台不支持流式请求响应,请参考对应平台能力。

安装依赖

$ npm i @midwayjs/http-proxy@3 --save

或者在 package.json 中增加如下依赖后,重新安装。

{
"dependencies": {
"@midwayjs/http-proxy": "^3.0.0"
// ...
},
"devDependencies": {
// ...
}
}

启用组件

src/configuration.ts 中引入组件

// ...
import * as proxy from '@midwayjs/http-proxy';

@Configuration({
imports: [
// ...other components
proxy,
],
})
export class MainConfiguration {}

配置

代理配置定义如下:

// 代理配置类型
export interface HttpProxyConfig {
// 匹配要代理的 URL 正则表达式
match: RegExp;
// 替换匹配到的链接的 host,将请求代理到此地址
host?: string;
// 通过正则的表达式捕获组处理代理地址
target?: string;
// 转发请求超时时间,默认为0不设置超时时间
proxyTimeout?: number;
// 忽略代理请求转发的 header 中的字段
ignoreHeaders?: {
[key: string]: boolean;
};
}

代理支持单个代理和多个代理。

单个代理配置

// src/config/config.default.ts

export default {
httpProxy: {
match: /\/tfs\//,
host: 'https://gw.alicdn.com',
},
};

多个代理配置

// src/config/config.default.ts

// 代理配置类型
export default {
httpProxy: {
default: {
// 一些每个策略复用的值,会和底下的策略进行合并
},
strategy: {
gw: {
// https://gw.alicdn.com/tfs/TB1.1EzoBBh1e4jSZFhXXcC9VXa-48-48.png
match: /\/tfs\//,
host: 'https://gw.alicdn.com',
},
g: {
// https://g.alicdn.com/mtb/lib-mtop/2.6.1/mtop.js
match: /\/bdimg\/(.*)$/,
target: 'https://sm.bdimg.com/$1',
},
httpBin: {
// https://httpbin.org/
match: /\/httpbin\/(.*)$/,
target: 'https://httpbin.org/$1',
},
},
},
};

示例:使用 host 配置代理

export default {
httpProxy: {
match: /\/tfs\//,
host: 'https://gw.alicdn.com',
},
};

当请求您的站点路径为: https://yourdomain.com/tfs/test.png 时,match 字段配置的正则表达式成功匹配,那么就将原始请求路径中的 host 部分 https://yourdomain.com 替换为配置的 https://gw.alicdn.com,从而发起代理请求到 https://gw.alicdn.com/tfs/test.png,并把响应结果返回给请求您站点的用户。

示例:使用 target 配置代理

export default {
httpProxy: {
match: /\/httpbin\/(.*)$/,
target: 'https://httpbin.org/$1',
},
};

当请求您的站点路径为: https://yourdomain.com/httpbin/get?name=midway 时,match 字段配置的正则表达式成功匹配,同时正则的捕获组中有结果 ['get?name=midway'] ,那么就将原始请求路径中的 $1 部分替换为捕获组中的第 1 个数据(index: 0)的 get?name=midway,从而发起代理请求到 https://httpbin.org/get?name=midway,并把响应结果返回给请求您站点的用户。