scala – 用于HTTP网关的Play2-mini和Akka2
发布时间:2020-12-16 08:57:01 所属栏目:安全 来源:网络整理
导读:我正在评估使用 Play2-mini与Scala开发服务的可能性,该服务将位于移动客户端和现有Web服务之间.我正在寻找一个代码片段的最简单的例子,其中Play2-mini实现了服务器和客户端.理想情况下,客户端将使用Akka2 actor. 有了这个问题,我试图找出它是如何完成的,还要
我正在评估使用
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") } } } 它所做的只是将GET请求作为POST请求转发到后端服务.后端服务在请求参数中指定为目标,POST请求的主体在请求参数中指定为数据(必须是有效的XML).作为奖励,请求是异步处理的(因此是异步).一旦收到来自后端服务的响应,前端服务就会响应一些显示后端服务响应的基本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网关,您可以使用Async和play.api.libs.ws.WS与Akka一起工作以提供异步处理(不需要显式的Actors).祝你的Play2 / Akka2项目好运. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |