1

常に JSON 応答を返す RESTful サービスを照会する必要があります。何度か連絡する必要がありますが、常に前回のリクエストから学んだ情報がいくつかあります。Akka2、Scala、Jerkson、Spray-Can を使用しています。

私の現在のアプローチは機能しているようですが、見た目が悪く、すべてをネストする必要があります。チェーンなどに関して利用可能なテクニックがいくつかあるはずだと読みましたが、現在のユースケースにそれらを適用する方法がわかりませんでした。

これが私が話しているコードです:

def discoverInitialConfig(hostname: String, bucket: String) = {

    val poolResponse: Future[HttpResponse] = 
      HttpDialog(httpClient, hostname, 8091)
      .send(HttpRequest(uri = "/pools"))
      .end

    poolResponse onComplete { 
      case Right(response) =>
        log.debug("Received the following global pools config: {}", response)

        val pool = parse[PoolsConfig](response.bodyAsString)
          .pools
          .find(_("name") == defaultPoolname)
          .get

        val selectedPoolResponse: Future[HttpResponse] =
          HttpDialog(httpClient, hostname, 8091)
          .send(HttpRequest(uri = pool("uri")))
          .end

        selectedPoolResponse onComplete {
          case Right(response) =>
            log.debug("Received the following pool config: {}", response)

            println(response.bodyAsString)

          case Left(failure) =>
            log.error("Could not load the pool config! {}", failure)
        }

      case Left(failure) =>
        log.error("Could not load the global pools config! {}", failure)
    }

模様が見えると思います。REST サービスに連絡して読み取り、成功したら JSON ケース クラスに解析し、情報を抽出してから次の呼び出しを行います。

ここでの構造は 2 レベルの深さしかありませんが、3 番目のレベルも追加する必要があります。

読みやすくするためにこれを改善するためのテクニックはありますか、それともこれに固執することはできますか? さらに情報が必要な場合は、喜んで提供いたします。ここで完全なコードを見ることができます: https://github.com/daschl/cachakka/blob/f969d1f56a4c90a929de9c7ed4e4a0cccea5ba70/src/main/scala/com/cachakka/cluster/actors/InitialConfigLoader.scala

ありがとう、マイケル

4

2 に答える 2

2

HttpDialogは、ユースケースを正確にカバーしているようです。

于 2012-11-17T10:25:06.720 に答える
0

replyスプレー缶から提供された方法を使用して、合理的な近道を見つけたと思います。

def discoverInitialConfig(hostname: String, bucket: String) = {

val poolResponse: Future[HttpResponse] = 
  HttpDialog(httpClient, hostname, 8091)
  .send(HttpRequest(uri = "/pools"))
  .reply(response => {
    log.debug("Received the following global pools config: {}", response)
    val selectedPool = parse[PoolsConfig](response.bodyAsString)
      .pools.find(_("name") == defaultPoolname).get
    HttpRequest(uri = selectedPool("uri"))
  })
  .reply(response => {
    log.debug("Received the following pool config: {}", response)
    println(response.bodyAsString)
    HttpRequest(uri = "/")
  })
  .end

}

これが利用可能な最善のアプローチである場合は、「回答済み」とマークしますが、私よりもこのことをよく知っている人から実際の回答を得たいと思っています.

于 2012-08-18T09:00:16.263 に答える