2014-12-30 5 views
6

Ich habe diese Route:Wie können POST-Parameter und JSON-Körper in einer einzelnen Route entpackt werden?

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

Das funktioniert gut, kann ich rufe meine ElevationService als:

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

Das Problem ist, ich möchte auch den Körper zu mir in der Anfrage gesendet analysieren als JSON. Es sieht aus wie folgt:

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

Ich habe es geschafft, um es in einem separaten Weg folgt the documentation on the entity directive an die Arbeit:

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

Aber ich weiß nicht, wie diese beiden Routen zu einer verschmelzen. Da sie in Funktionen eingepackt sind, kann ich die Parameter long, lat nicht innerhalb der entity Funktion aufrufen, sie existieren nicht in diesem Bereich, nehme ich an. Das gleiche gilt oder umgekehrt.

Ich möchte in der Lage sein, sowohl Körper mein params und meine POST zuzugreifen, und rufen Sie dann ein Dienst alle Daten übergeben:

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

Antwort

6

Sie können nur nisten die Richtlinien:

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

Sie können auch & verwenden, um zwei Direktiven direkter zu kombinieren:

+0

Vielen Dank, ich werde es geben ein Versuch, aber ich bekomme "fehlende Parameter Typ: actorReply", offensichtlich, da es nirgends definiert ist. Ist das "actorReply" eine Art Callback für den Actor, oder wozu? Es tut mir leid, wenn ich dumme Frage stelle, ich beginne gerade mit Spray und dieses DSL-Routing ist so verwirrend. –

+2

'actorReply' ist, was ich als Name für die Antwort des Schauspielers benutzte. Ich habe vergessen, dass akka nicht typisiert ist, also würde es wahrscheinlich eine Besetzung benötigen. Wenn Sie nicht auf eine Antwort des Schauspielers warten müssen, brauchen Sie weder '?' Noch 'onSuccess', Sie können einfach'! 'Verwenden, um eine Feuer-und-Vergessen-Nachricht an den Schauspieler zu senden Lass es da. – lmm

Verwandte Themen