Как демонтировать параметры 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. Это выглядит следующим образом:

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

Мне удалось заставить его работать по отдельному маршруту, следуя документации по директиве объекта:

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

Но я не знаю, как объединить эти два маршрута в один. Так как они заключены в функции, я не могу вызвать параметры long, lat изнутри entity функции, они не существуют в этой области, я полагаю. То же самое или наоборот.

Я хочу иметь доступ к моим параметрам и телу POST, а затем вызвать службу, передав все данные:

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

1 ответ

Решение

Вы можете просто вложить директивы:

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

Вы также можете использовать & объединить две директивы более непосредственно:

(path("ElevationService" / DoubleNumber / DoubleNumber) & entity(as[ScriveRequest])) {
  (long, lat, scriveRequest) => ...
Другие вопросы по тегам