6. 代理

因为Rachel框架是跨平台框架,它可能有wasmjs侧的target,此时客户端请求某些站点可能会有跨域的问题。

在客户端可以通过对应的proxy构造出服务端实际的代理地址,然后请求到服务端后,如果服务端也定义了proxy, 那么会在服务器中启动一个Http客户端,访问请求后再将响应结果转发回原客户端。

服务端定义代理的方式非常简单,只需要在引擎中重写proxy的路径名与白名单即可。示例如下:

Kotlin
1
2
3
4
5
6
override val proxy = Proxy(name = "proxy", whitelist = listOf(
    "(?:https?://)?m\\.weibo\\.cn.*".toRegex(),
    "(?:https?://)?visitor\\.passport\\.weibo\\.cn.*".toRegex(),
    "(?:https?://)?(?:wx|tvax)\\d+\\.sinaimg\\.cn.*".toRegex(),
    "(?:https?://)?f\\.video\\.weibocdn\\.com.*".toRegex(),
))

例如此处定义了代理的名称为proxy,那么客户端实际上发送的路径为localhost:port/proxy?proxy={url}。 客户端会将需要代理的目标地址作为参数传递到服务端,服务端接收后会通过一个正则表达式列表的白名单来决定是否代理。

请求转发包括了body数据与header

Tip

这里的路径名与静态资源目录一样,最好在公共模块中定义,保证客户端和服务端访问的是同一个路径。