gpt4 book ai didi

scala - 用于 HTTP 网关的 Play2-mini 和 Akka2

转载 作者:行者123 更新时间:2023-12-04 07:42:27 24 4
gpt4 key购买 nike

我正在评估使用 Play2-mini 的可能性与 Scala 合作开发一种介于移动客户端和现有 Web 服务之间的服务。我正在寻找一段代码的最简单示例,其中 Play2-mini 实现了服务器和客户端。理想情况下,客户端将使用 Akka2 Actor 。

带着这个问题,我试图找出它是如何完成的,同时也想看看 Play2-Mini 和 Akka2 应该如何合作。由于 Play2-Mini 似乎是 Akka HTTP 模块的替代品。

Play2-mini 包含以下代码示例,其中我创建了两个 TODO。如果有人可以帮助我一些示例代码开始,我将非常感激。

package com.example

import com.typesafe.play.mini._
import play.api.mvc._
import play.api.mvc.Results._

object App extends Application {
def route = {
case GET(Path("/testservice")) & QueryString(qs) => Action{ request=>
println(request.body)
//TODO Take parameter and content from the request them pass it to the back-end server
//TODO Receive a response from the back-end server and pass it back as a response
Ok(<h1>Server response: String {result}</h1>).as("text/html")
}
}
}

最佳答案

这是您的示例的实现。

添加以下导入:

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") }
}
}

它所做的只是转发 GETPOST 形式向后端服务请求要求。后端服务在请求参数中指定为 target POST 请求的主体在请求参数中指定为 data (必须是有效的 XML)。作为奖励,请求是异步处理的(因此 Async )。一旦收到来自后端服务的响应,前端服务就会使用一些基本的 HTML 来响应,以显示后端服务的响应。

如果您想使用请求正文,我建议添加以下 POST路线而不是 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 网关,您可以使用 Asyncplay.api.libs.ws.WS Akka 在后台工作以提供异步处理(不需要显式的 Actor)。祝你的 Play2/Akka2 项目好运。

关于scala - 用于 HTTP 网关的 Play2-mini 和 Akka2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com