Вот реализация вашего примера.
Добавьте следующий импорт:
import play.api.libs.ws.WS
import play.api.mvc.BodyParsers.parse
import scala.xml.XML
Добавьте следующий маршрут:
case GET(Path("/testservice")) & QueryString(qs) => Action{ request =>
Async {
val backendUrl = QueryString(qs,"target") map (_.get(0)) getOrElse("http://localhost:8080/api/token")
val tokenData = QueryString(qs,"data") map (_.get(0)) getOrElse("<auth>john</auth>")
WS.url(backendUrl).post(XML loadString tokenData).map { response =>
Ok(<html><h1>Posted to {backendUrl}</h1>
<body>
<div><p><b>Request body:</b></p>{tokenData}</div>
<div><p><b>Response body:</b></p>{response.body}</div>
</body></html>).as("text/html") }
}
}
Все, что он делает, это пересылкаGET
запрос к серверному серверу как POST
запрос.Внутренняя служба указывается в параметре запроса как target
, а тело запроса POST указывается в параметре запроса как data
(должен быть допустимым XML).В качестве бонуса запрос обрабатывается асинхронно (отсюда Async
).Как только ответ от серверной службы получен, интерфейсная служба отвечает некоторым базовым HTML, показывающим ответ серверной службы.
Если вы хотите использовать тело запроса, я бы предложил добавить следующее POST
route вместо GET
(опять же, в этом теле реализации должен быть действительный XML):
case POST(Path("/testservice")) & QueryString(qs) => Action(parse.tolerantXml){ request =>
Async {
val backendUrl = QueryString(qs,"target") map (_.get(0)) getOrElse("http://localhost:8080/api/token")
WS.url(backendUrl).post(request.body).map { response =>
Ok(<html><h1>Posted to {backendUrl}</h1>
<body>
<div><p><b>Request body:</b></p>{request.body}</div>
<div><p><b>Response body:</b></p>{response.body}</div>
</body></html>).as("text/html") }
}
}
Итак, как вы можете видеть, для своего HTTP-шлюза вы можете использовать Async
и play.api.libs.ws.WS
с Akka под капотом, работающим для обеспечения асинхронной обработки (явные актеры не требуются).Удачи в вашем проекте Play2 / Akka2.