Как демонтировать параметры 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) => ...