这是我的路由:
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"
}
}
}
}