Scala喷雾路由 - 针对单个请求执行的两个HTTP方法指令



这是我的路由:

pathPrefix("event" / Segment / "user") { id =>
    pathEnd {
        put {
            dbService.addParticipant(id, user)
            complete("OK")
        } ~
        delete {
            dbService.removeParticipant(id, user)
            complete("OK")
        }
    }
} ~  

在将PUT或DELETE请求发送到http://localhost:9999/event/860852c4-768f-430e-9a9d-d1d35e86ede2/user时,执行两个方法指令 - 我的意思是调用dbService.addParticipant(id, user)dbService.removeParticipant(id, user)。谁能向我解释一下这里的问题?

我看不出这与官方喷雾示例有何不同:

// extract URI path element as Int
pathPrefix("order" / IntNumber) { orderId =>
  pathEnd {
    // method tunneling via query param
    (put | parameter('method ! "put")) {
      // form extraction from multipart or www-url-encoded forms
      formFields('email, 'total.as[Money]).as(Order) { order =>
        complete {
          // complete with serialized Future result
          (myDbActor ? Update(order)).mapTo[TransactionResult]
        }
      }
    } ~
    get {
      // JSONP support
      jsonpWithParameter("callback") {
        // use in-scope marshaller to create completer function
        produce(instanceOf[Order]) { completer => ctx =>
          processOrderRequest(orderId, completer)
        }
      }
    }
  }

正如@jrudolph指出的那样,在非叶提取指令中的代码(例如内部pathPrefix("order" / IntNumber) { orderId =>,因为它要从请求中提取的orderId参数)是每个请求执行的)内部的指示正在撞到路线。仅在路由匹配时执行叶子方向内的代码(例如complete)。

要实现您可能想要的东西,只需将dbService.addParticipant移动到complete中:

pathPrefix("event" / Segment / "user") { id =>
    pathEnd {
        put {
            complete {
              dbService.addParticipant(id, user)
              "OK"
            }
        } ~
        delete {
            complete {
              dbService.removeParticipant(id, user)
              "OK"
            }
        }
    }
}

最新更新