首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lift作为代理

使用lift作为代理
EN

Stack Overflow用户
提问于 2012-04-17 09:33:40
回答 1查看 375关注 0票数 0

我想禁止从外部完全访问Solr核心,让它只用于查询。因此,我在端口上的Jetty容器(另外,主webapp)中启动辅助服务器w/连接器实例,这是WWW无法访问的。

当有传入的HTTP请求到liftweb应用程序时,我会挂接RestHelper

代码语言:javascript
复制
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 is not implemented yet. rest: List(solr, select)",因此它似乎是有效的。现在,我想在内部端口( Solr所在的地方)上进行连接,以便使用URL的post-api部分(即http://localhost:8080/solr/select?q=region)传递查询。我正在捕获尾随的REST-- URL的一部分(通过a @ _*),但是我如何访问URL参数?最好将一个原始字符串(在api路径元素之后)传递给Solr实例,这只是为了防止冗余的解析/构建步骤。Solr的响应也是如此:我想避免解析构建JsonResponse。

这似乎是做一些HTTP重定向的一个很好的例子,但是据我所能理解,我将不得不打开隐藏的Solr端口。

应对这一任务最有效的方法是什么?

编辑:

嗯,我错过了JsonGet之后的Req值,它拥有所有所需的信息。但是,是否仍然有一种方法可以避免对隐藏端口和JSON-响应进行不必要的解析/组合URL?

解决方案:

这就是我同意戴夫的建议:

代码语言:javascript
复制
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(""))
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-17 15:57:53

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10188669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档