【问题标题】:Handle services returning Try values in Spray在 Spray 中处理返回 Try 值的服务
【发布时间】:2015-07-27 10:06:41
【问题描述】:

我正在开发一个代码库,其中调用我的 Spray API 需要同步调用返回 Try 的服务,Spray 需要格式化并通过 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 调用。

所以我有两个问题:

  1. 为什么在初始化路由时会调用我的服务?
  2. 处理这种情况最干净的方法是什么?想象一下,还有一些其他端点遵循类似的模式。所以我需要能够始终如一地处理这个问题。

【问题讨论】:

    标签: scala try-catch spray spray-dsl


    【解决方案1】:

    即使您将结果参数作为名称调用,它也会在您执行时立即得到评估

    result match {
    

    为了不被评估,它必须是完整的,即你的代码应该看起来像(没有尝试编译这个):

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

    【讨论】:

      【解决方案2】:

      我解决这个问题的方法是执行以下操作:

      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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 2021-04-10
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多