You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ktor代理开发:实现转发所有请求并添加认证头的中间件

Ktor中间件实现带认证头的请求转发代理

针对你要实现的代理中间件,原代码存在几个需要优化的点,比如URL拼接可能出错、未转发原请求的方法和请求体、响应处理不够严谨。下面是完善后的实现:

intercept(ApplicationCallPipeline.Call) {
    // 用Url类安全构建目标URL,避免拼接导致的格式问题
    val originalUrl = Url(call.request.uri)
    val targetUrl = Url(BASE_URL).copy(
        path = originalUrl.path,
        queryParameters = originalUrl.queryParameters
    )

    // 转发原请求的所有信息,同时添加认证头
    val response = client.request(targetUrl) {
        // 复用原请求的HTTP方法
        method = call.request.method
        // 转发原请求体(针对POST/PUT等带body的请求)
        if (call.request.content.isNotEmpty()) {
            body = call.request.content
        }
        // 转发原请求的必要头信息,再添加认证头
        headers.appendAll(call.request.headers.filter { key ->
            // 排除Authorization,避免冲突,也可以根据需求调整
            key != HttpHeaders.Authorization
        })
        headers.append(HttpHeaders.Authorization, "Bearer $API_KEY")
    }

    // 正确转发响应状态、头和体
    call.respond(response.status) {
        headers.appendAll(response.headers)
        body = response.bodyAsChannel()
    }
}

关键优化点说明:

  • URL构建:使用Ktor的Url类来解析和拼接,避免手动拼接导致的路径重复(比如//)或参数丢失问题
  • 请求转发完整性:保留原请求的HTTP方法、请求体和大部分头信息,确保代理后的请求和原请求一致
  • 头信息处理:过滤掉原请求的Authorization头(避免和我们添加的认证头冲突),再追加自定义的Bearer认证头
  • 响应处理:手动转发响应状态、头和响应体,确保客户端能正确接收目标服务的响应

内容的提问来源于stack exchange,提问作者dpmrox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:21:06