外部からのSolrコアへのフルアクセスを禁止し、クエリにのみ使用できるようにします。したがって、WWWからアクセスできない、ポート上のJettyサーブレットコンテナ内(メインwebapp以外)のセカンダリサーバw/connectorインスタンスを起動します。 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)"
を取得し、動作しているようです。今度は、
api
のURLの後の部分(つまり、
http://localhost:8080/solr/select?q=region
)を使用してクエリを渡すために、内部ポート(Solrが存在する)で接続を行いたいとします。 URLの末尾のREST部分(
a @ _*
を使用)をキャッチしていますが、どのようにURLパラメータにアクセスできますか?冗長な解析/構築のステップを防ぐために、生の文字列(
api
パス要素の後)をSolrインスタンスに渡すのが理想的です。 Solrの応答にも当てはまります.JsonResponseの構築を解析することは避けたいと思います。
これは、HTTPリダイレクトを実行する上での良い例のようですが、わかっている限り、非表示のSolrのポートを開く必要があります。
このタスクに対処する最も効果的な方法は何ですか?
EDIT:
まあ、私はJsonGet
後に必要なすべての情報を持っているReq
値を、来ることを逃しました。しかし、不要な解析/ URLを隠しポートやJSONレスポンスに組み込むのを避ける方法はまだありますか?
SOLUTION:
これは私がconsderingデイブの提案持っているものです:
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(""))
}