基于RestRserve实现跨端口请求精准转发的最优方案问询
RestRserve实现请求转发的最优方案
我用RestRserve搭建了两个运行在不同端口的应用(也可部署于我管控的不同服务器),希望将发往:8081/health的请求完整转发至:8080/health,获取响应后返回给客户端,需传递所有查询字符串等参数,仅替换基础URL,使http://localhost:8081/health的请求效果与http://localhost:8080/health完全一致。请问实现该需求的最优(最简/最清晰/最健壮)方式是什么?
实现方案
最优方式是借助httr2包(R生态中简洁健壮的HTTP客户端)完成请求转发,它能完整保留原请求的查询参数、请求头(必要时调整),并将目标服务的响应原样返回给客户端。
完整代码
library(RestRserve) library(httr2) app1 = Application$new() app2 = Application$new() # 目标服务(端口8080)的/health接口 app1$add_get( path = "/health", FUN = function(.req, .res) { # 模拟带查询参数的响应,验证转发是否生效 query_params <- .req$get_query() if (length(query_params) > 0) { .res$set_body(paste0("OK 1! 收到参数: ", paste(names(query_params), query_params, sep="=", collapse=", "))) } else { .res$set_body("OK 1!") } }) # 转发服务(端口8081)的自有接口 app2$add_get( path = "/health2", FUN = function(.req, .res) { .res$set_body("OK 2!") }) # 转发服务的/health接口,实现请求转发逻辑 app2$add_get( path = "/health", FUN = function(.req, .res) { # 1. 构造目标URL,替换基础端口 target_url <- "http://localhost:8080/health" # 2. 创建httr2请求对象,继承原请求的方法(这里是GET) req <- request(target_url) |> req_method(.req$method) # 3. 添加原请求的所有查询参数 query_params <- .req$get_query() if (length(query_params) > 0) { req <- req |> req_url_query(!!!query_params) } # 4. 复制原请求的请求头(排除Host,避免目标服务收到错误的Host值) req_headers <- .req$get_headers() req_headers <- req_headers[!names(req_headers) %in% c("Host", "host")] if (length(req_headers) > 0) { req <- req |> req_headers(!!!req_headers) } # 5. 发送请求并获取响应 resp <- req |> req_perform() # 6. 将目标服务的响应原样返回给客户端 .res$set_status(resp$status_code) .res$set_headers(resp$headers) .res$set_body(resp_body_string(resp)) }) backend = BackendRserve$new() backend$start(app1, http_port = 8080, background = TRUE) backend$start(app2, http_port = 8081)
关键细节说明
- 参数完整传递:通过
.req$get_query()获取原请求所有查询参数,用req_url_query(!!!query_params)批量添加到目标请求,确保参数不丢失。 - 请求头处理:复制原请求头但排除
Host,避免目标服务收到localhost:8081的Host值,保证请求合法性。 - 响应原样返回:将目标服务的状态码、响应头、响应体完全复制到当前响应中,让客户端感知不到转发过程。
- 健壮性:
httr2会自动处理HTTP协议细节(如编码、连接复用),相比手动构造请求更可靠。
内容的提问来源于stack exchange,提问作者richarddmorey
相关产品推荐
相关产品推荐

