2014-12-30 10 views
6

mam tę drogę:Jak pozamieniać params POST i ciało JSON w jednej trasie?

val routes = 
    pathPrefix("api") { 
     path("ElevationService"/DoubleNumber/DoubleNumber) { (long, lat) => 
     post { 
      requestContext => 
      println(long, lat) 
     } 
     } 
    } 

Działa to dobrze, mogę zadzwonić do mojego ElevationService jak:

http://localhost:8080/api/ElevationService/39/80 

Problem polega na tym, ja też chcę analizować ciało wysłany do mnie we wniosku jako JSON. Wygląda to następująco:

{ 
    "first": "test", 
    "second": 0.50 
} 

udało mi się zmusić go do pracy w oddzielnej trasy po the documentation on the entity directive:

path("test") { 
    import scrive.actors.ScriveJsonProtocol 
    import spray.httpx.SprayJsonSupport._ 
    post { 
     entity(as[ScriveRequest]) { scrive => 
     complete(scrive) 
     } 
    } 
} 

Ale ja nie wiem, jak połączyć te dwie drogi w jedną. Ponieważ są one opakowane w funkcje, nie mogę wywoływać funkcji long, z funkcji entity, nie istnieją one w tym zakresie, jak przypuszczam. To samo dotyczy lub na odwrót.

Chcę mieć dostęp zarówno moje params i moje ciało POST, a następnie wezwać serwis, przechodząc wszystkie dane:

val elevationService = actorRefFactory.actorOf(Props(new ElevationService(requestContext))) 
elevationService ! ElevationService.Process(long, lat, bodyParams) 

Odpowiedz

6

można po prostu zagnieździć dyrektywami:

path("ElevationService"/DoubleNumber/DoubleNumber) { (long, lat) => 
    post { 
    entity(as[ScriveRequest]) { scrive => 
     onSuccess(elevationService ? ElevationService.Process(long, lat, bodyParams)) { 
     actorReply => 
      complete(actorReply) 
     } 
    } 
} 

Możesz także użyć &, aby łączyć dwie dyrektywy bardziej bezpośrednio:

(path("ElevationService"/DoubleNumber/DoubleNumber) & entity(as[ScriveRequest])) { 
    (long, lat, scriveRequest) => ... 
+0

Dziękuję, dam to spróbuj, ale dostaję "Brak parametru parametru: actorReply", oczywiście, ponieważ nie jest nigdzie zdefiniowany. Czy to "actorReply" jest jakimś callbackiem dla Aktora, lub do czego służy. Przykro mi, jeśli zadaję głupie pytanie, dopiero zaczynam od sprayu, a routing dsl jest tak mylący. –

+2

'actorReply' to nazwa, której użyłem jako nazwy odpowiedzi od aktora. Zapomniałem, że akka jest bez typu, więc prawdopodobnie potrzebowałby obsady. Jeśli nie musisz czekać na odpowiedź od aktora, to nie potrzebujesz '?' Lub 'onSuccess', możesz po prostu użyć'! ', Aby wysłać wiadomość o pożarze i zapomnieniu do aktora i zostaw to tam. – lmm