Scala 使用lift作为代理

Scala 使用lift作为代理,scala,url,proxy,lift,Scala,Url,Proxy,Lift,我想禁止从外部完全访问Solr核心,并让它仅用于查询。因此,我在端口上的Jetty servlet容器(除主webapp外)内启动辅助服务器w/connector实例,该端口无法从WWW.com访问 当有对liftweb应用程序的传入HTTP请求时,我使用RestHelper钩住: object Dispatcher extends RestHelper { serve { case List("api", a @ _*) JsonGet _ => JString("API i

我想禁止从外部完全访问Solr核心,并让它仅用于查询。因此,我在端口上的Jetty servlet容器(除主webapp外)内启动辅助服务器w/connector实例,该端口无法从WWW.com访问

当有对
liftweb
应用程序的传入HTTP请求时,我使用
RestHelper
钩住:

object Dispatcher extends RestHelper {
  serve {
    case List("api", a @ _*) JsonGet _ => JString("API is not implemented yet. rest: " + a)
  }
}
将我的浏览器定位到
http://localhost/api/solr/select?q=region
我得到一个响应
“API还没有实现。rest:List(solr,select)”
,所以它似乎可以工作。现在我想在内部端口(Solr所在的位置)上建立连接,以便使用URL的post-
api
部分(即
http://localhost:8080/solr/select?q=region
)。我正在捕获URL的尾部剩余部分(通过
a@*
),但是如何访问URL参数?最好将原始字符串(在
api
path元素之后)传递给Solr实例,以防止冗余的解析/构建步骤。因此适用于Solr的响应:我希望避免解析构建JsonResponse

这似乎是进行HTTP重定向的一个很好的例子,但据我所知,我必须打开隐藏的Solr端口

处理这项任务最有效的方法是什么

编辑:

嗯,我错过了
JsonGet
之后的
Req
值,它包含了所有需要的信息。但仍然有办法避免对隐藏端口的URL和JSON响应进行不必要的解析/组合吗

解决方案:

这就是我得到的康斯德林·戴夫的建议:

import net.liftweb.common.Full
import net.liftweb.http.{JsonResponse, InMemoryResponse}
import net.liftweb.http.provider.HTTPRequest
import net.liftweb.http.rest.RestHelper
import dispatch.{Http, url}

object ApiDispatcher extends RestHelper {
  private val SOLR_PORT = 8080

  serve { "api" :: Nil prefix {
    case JsonGet(path @ List("solr", "select"), r) =>
      val u = localApiUrl(SOLR_PORT, path, r.request)
      Http(url(u) >> { is =>
        val bytes = Stream.continually(is.read).takeWhile(-1 !=).map(_.toByte).toArray
        val headers = ("Content-Length", bytes.length.toString) ::
          ("Content-Type", "application/json; charset=utf-8") :: JsonResponse.headers
        Full(InMemoryResponse(bytes, headers, JsonResponse.cookies, 200))
      })
  }}

  private def localApiUrl(port: Int, path: List[String], r: HTTPRequest) =
    "%s://localhost:%d/%s%s".format(r.scheme, port, path mkString "/", r.queryString.map("?" + _).openOr(""))
}

我不确定是否理解您的问题,但如果您想返回从solr收到的JSON而不进行解析,可以使用net.liftweb.http.InMemoryResponse,其中包含JSON的byte[]表示形式