0

私は、Spray API を呼び出すときに、Try を返すサービスを同期的に呼び出す必要があるコードベースに取り組んでいます。どのスプレーをフォーマットして、HTTP 経由で返す必要があります。

私の最初の試みは次のようになりました:

// Assume myService has a run method that returns a Try[Unit]
lazy val myService = new Service() 

val routes = 
  path("api") {
    get {
      tryToComplete {
        myService.run()
      } 
    }
  } ~ 
  path("api" / LongNumber) { (num: Long) =>
    get {
      tryToComplete {
        myService.run(num)
      } 
    }
  }

def tryToComplete(result: => Try[Unit]): routing.Route = result match {
  case Failure(t) => complete(StatusCodes.BadRequest, t.getMessage)
  case Success(_) => complete("success")
}

ただし、これによりmyService.run()、アプリケーションの起動時に呼び出されました。HTTP 呼び出しが行われていないため、このメソッドが呼び出された理由はわかりません。

だから私は2つの質問があります:

  1. ルートの初期化の一部としてサービスが呼び出されるのはなぜですか?
  2. このケースを処理する最もクリーンな方法は何ですか? 同様のパターンをたどるエンドポイントが他にもいくつかあると想像してください。したがって、これを一貫して処理できる必要があります。
4

2 に答える 2

0

私がこれを解決した方法は、次のことを行うことでした:

lazy val myService = new Service() 

val routes = 
  path("api") {
    get {
      complete {
        handleTry {
          myService.run()
        }
      } 
    }
  } ~ 
  path("api" / LongNumber) { (num: Long) =>
    get {
      complete {
         handleTry {
          myService.run(num)
        } 
      }
    }
  }

private def handleTry(operation: Try[_]):HttpResponse = operation match {
  case Failure(t) => 
    HttpResponse(status = StatusCodes.BadRequest, entity = t.getMessage)
  case Success(_) => 
    HttpResponse(status = StatusCodes.OK, entity = successMessage)
}
于 2015-05-15T14:47:19.053 に答える
0

名前による呼び出しとして結果パラメーターがありますが、実行しているとすぐに評価されます

result match {

評価されないようにするには、完全な範囲内にある必要があります。つまり、コードは次のようになります (これをコンパイルしようとしていません)。

def tryToComplete(result: => Try[Unit]): routing.Route = complete {
result match {
  case Failure(t) => StatusCodes.BadRequest, t.getMessage
  case Success(_) => "success"
}
}
于 2015-05-15T14:00:06.367 に答える