我想禁止从外部对Solr核心的完全访问,并让它仅用于查询。因此,我在端口上的Jetty servlet容器(此外,主webapp)中启动辅助服务器w /连接器实例,无法从WWW访问。
当有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 is not implemented yet. rest: List(solr, select)"
,因此它似乎有效。现在我想在内部端口(Solr所在的位置)上建立连接,以便使用URL的api
部分(即http://localhost:8080/solr/select?q=region
)传递查询。我正在捕获URL的尾随REST部分(通过a @ _*
),但是如何访问URL参数?将原始字符串(在api
路径元素之后)传递给Solr实例是理想的,只是为了防止冗余的解析/构建步骤。所以适用于Solr的响应:我想避免解析构建JsonResponse。
这似乎是做一些HTTP重定向的好例子,但是就我所知,我必须打开隐藏的Solr端口。
应对此任务的最有效方法是什么?
修改
好吧,在JsonGet
来Req
后,我错过了这个值,它包含了所有需要的信息。但是还有办法避免不必要的解析/组合URL到隐藏端口和JSON响应吗?
SOLUTION:
这就是我对戴夫的建议所采取的建议:
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(""))
}
答案 0 :(得分:1)
我不确定我是否理解你的问题,但是如果你想要在不解析它的情况下返回你从solr收到的JSON,你可以使用包含jSON的byte []表示的net.liftweb.http.InMemoryResponse。