2012-04-17 2 views
0

외부에서 Solr 코어에 대한 모든 액세스를 금지하고 쿼리에만 사용하도록하겠습니다. 따라서 WWW에서 액세스 할 수없는 포트의 Jetty 서블릿 컨테이너 (기본 웹 응용 프로그램) 내부에 보조 서버 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)"을 얻을, 그래서 작동하는 것 같다. 이제이후의 부분 (즉, http://localhost:8080/solr/select?q=region)을 사용하여 쿼리를 전달하기 위해 내부 포트 (Solr이있는 곳)에 연결하려고합니다. URL의 후행 부분 ( a @ _*을 통해)을 잡아 내고 있는데 URL 매개 변수에 어떻게 액세스 할 수 있습니까? 중복 된 구문 분석/빌드 단계를 방지하기 위해 원시 문자열 ( api 경로 요소 이후)을 Solr 인스턴스에 전달하는 것이 이상적입니다. Solr의 응답에도 적용됩니다. JsonResponse를 파싱하는 것을 피하고 싶습니다.

이것은 HTTP 리디렉션을 수행하는 좋은 예인 것처럼 보입니다.하지만 이해할 수있는 한 숨겨진 Solr의 포트를 열어야합니다.

이 작업을 처리하는 가장 효과적인 방법은 무엇입니까?

편집 :

글쎄, 내가 놓친 그 JsonGet는 모든 필요한 정보를 가지고 Req 값을 제공 한 후. 하지만 여전히 숨겨진 포트 및 JSON 응답에 대한 원치 않는 파싱/URL 작성을 피할 수있는 방법이 있습니까?

해결책 :

이 내가 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를 사용할 수 있습니다.