2012-04-17 14 views
0

外部からの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("")) 
} 

答えて

1

私は私はあなたの質問を理解していることはよく分からないが、しかし、あなたはJSONあなたを返すようにしたい場合それを解析せずにsolrから受信すると、JSONのbyte []表現を含むnet.liftweb.http.InMemoryResponseを使用できます。

関連する問題