2014-12-30 2 views
6

나는이 길이 : 이것은 잘 작동단일 경로에서 POST 매개 변수와 JSON 본문을 비 정렬 화하는 방법은 무엇입니까?

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

, 내가 호출 할 수 있습니다 내 ElevationService 등 :

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

문제는 내가 또한 요청으로 나에게 보내 몸을 구문 분석 할이다 JSON.

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

하지만 하나에이 두 가지 경로를 병합하는 방법을 모른다 :

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

나는 그것이 the documentation on the entity directive 다음과 같은 별도의 경로에서 작동하도록 관리했습니다 : 다음과 같습니다. 그들은 함수로 싸여 있기 때문에 , lat 함수를 entity 함수 내에서 호출 할 수는 없습니다. 그런 가정은 존재하지 않습니다. 같은 것이거나 다른 방향입니다.

나는 서비스가 모든 데이터를 전달하는 전화를 한 후 내 PARAMS 내 POST 본문 모두에 액세스하고, 할 수 있도록하려면 :

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

답변

6

을 할 수 있습니다 단지 중첩 지침 :

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

&을 사용하여 두 가지 지시어를 더 직접 결합 할 수도 있습니다.

+0

감사합니다. 시도하지만, "누락 된 매개 변수 유형 : actorReply"를 얻습니다. 분명히 어디에도 정의되어 있지 않기 때문입니다. 이 "actorReply"는 Actor에 대한 콜백일까요, 아니면 무엇을위한 것입니까? 내가 바보 같은 질문을한다면 미안해. 나는 스프레이로 시작하고있어.이 DSL 라우팅은 혼란 스럽다. –

+2

'actorReply'는 액터의 응답 이름으로 사용하고 있습니다. 나는 akka가 타입이 없다는 것을 잊었다. 그래서 아마 캐스팅이 필요할 것이다. 액터로부터의 응답을 기다릴 필요가 없다면'?'또는'onSuccess'가 필요하지 않습니다.'!'를 사용하여 액터에 fire-and-forget 메시지를 보낼 수 있습니다. 거기에 두십시오. – lmm

관련 문제