here routing:
pathprefix("event" / segment / "user") { id => pathend { put { dbservice.addparticipant(id, user) complete("ok") } ~ delete { dbservice.removeparticipant(id, user) complete("ok") } } } ~
when sending put or delete request http://localhost:9999/event/860852c4-768f-430e-9a9d-d1d35e86ede2/user
both method directives executed - mean dbservice.addparticipant(id, user)
, dbservice.removeparticipant(id, user)
called. explain me problem here?
i not see how differs official spray example:
// extract uri path element int pathprefix("order" / intnumber) { orderid => pathend { // method tunneling via query param (put | parameter('method ! "put")) { // form extraction multipart or www-url-encoded forms formfields('email, 'total.as[money]).as(order) { order => complete { // complete serialized future result (mydbactor ? update(order)).mapto[transactionresult] } } } ~ { // jsonp support jsonpwithparameter("callback") { // use in-scope marshaller create completer function produce(instanceof[order]) { completer => ctx => processorderrequest(orderid, completer) } } } }
as @jrudolph pointed out, code inside non-leaf extraction directive (like inside pathprefix("order" / intnumber) { orderid =>
takes orderid
parameter gonna extracted request) executed per every request regardless wether or not directives inside hitting route. code inside leaf-directive (like complete
) executed when route matches.
to achieve want, move dbservice.addparticipant
inside complete
:
pathprefix("event" / segment / "user") { id => pathend { put { complete { dbservice.addparticipant(id, user) "ok" } } ~ delete { complete { dbservice.removeparticipant(id, user) "ok" } } } }
Comments
Post a Comment