[Tip] Finatra Default HttpClient 사용하기

Finatra 에서 Default HttpClient 사용하기. dest가 실제로 접속할 호스트로 설정되는 부분이다. hostname인줄 알고 했다가 계속 실패함. 이렇게 하고 HttpClient를 inject 하면 해당 설정을 이용한 걸고 injection이 되게 됨.

object DruidHttpClientModule extends HttpClientModuleTrait {
  //endpoint_url = "localhost:8080"
  private val config = ConfigFactory.load()
  override val dest = config.getString("endpoint_url")
  override val label = "Druid"

  override def defaultHeaders: Map[String, String] = Map("host" -> dest)
  @Provides
  @Singleton
  final def provideHttpClient(
      injector: Injector,
      statsReceiver: StatsReceiver,
      mapper: ScalaObjectMapper
  ): HttpClient = newHttpClient(injector, statsReceiver, mapper)
}

@Singleton
class DruidClient @Inject()(httpClient: HttpClient, mapper: ScalaObjectMapper) {
    def query[REQUEST, RESPONSE: Manifest](request: REQUEST): Future[Option[RESPONSE]] = {
        for {
            response <- httpClient.execute(RequestBuilder.post("/druid/v2/sql").body(mapper.writeValueAsString(request)))
        } yield {
            if (response.contentString == "null") {
                None
            } else {
               Some(mapper.parse[RESPONSE](response.contentString))
            }
        }
    }

    def query[REQUEST](request: REQUEST): Future[Option[String]] = {
        for {
            response <- httpClient.execute(RequestBuilder.post("/druid/v2/sql").body(mapper.writeValueAsString(request)))
        } yield {
            if (response.contentString == "null") {
                None
            } else {
                Some(response.contentString)
            }
        }
    }
}