常に 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
ありがとう、マイケル