0

外部からのSolrコアへのフルアクセスを禁止し、クエリにのみ使用できるようにします。したがって、ポート上のJettyサーブレットコンテナ(メインのWebアプリケーション以外)内でコネクタインスタンスを使用してセカンダリサーバーを起動していますが、これはWWWからはアクセスできません。

アプリケーションへの着信HTTPリクエストがあるliftweb場合、私は次のようにフックし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のポスト部分(つまり)を使用してクエリを渡すために、内部ポート(Solrが存在する場所)で接続を実行したいと思いますhttp://localhost:8080/solr/select?q=region。URLの末尾のREST部分を(を使用してa @ _*)キャッチしていますが、URLパラメーターにアクセスするにはどうすればよいですか?api冗長な解析/ビルド手順を防ぐために、生の文字列(パス要素の後)をSolrインスタンスに渡すことが理想的です。したがって、Solrの応答にも当てはまります。JsonResponseの構築を解析することは避けたいと思います。

これは、HTTPリダイレクトを実行する良い例のようですが、理解できる限り、非表示のSolrのポートを開く必要があります。

このタスクに対処するための最も効果的な方法は何ですか?

編集:

さて、私は、必要なすべての情報を持っている価値JsonGetが来た後にそれを逃しました。Reqしかし、隠しポートとJSON応答への不要な解析/作成URLを回避する方法はまだありますか?

解決:

これは私がデイブの提案を考慮しているものです:

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(""))
}
4

1 に答える 1

1

あなたの質問を理解できるかどうかはわかりませんが、solrから受け取ったJSONを解析せずに返したい場合は、JSONのbyte[]表現を含むnet.liftweb.http.InMemoryResponseを使用できます。

于 2012-04-17T15:57:53.837 に答える