rest - Scala Spray Routing - two HTTP method directives executed for single request -


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