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

标签 scala playframework playframework-2.0 play2-mini

我正在评估使用 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/

相关文章:

scala - 玩!框架使用异步 Web 请求组合操作

scala - 无法让 json4s 渲染我的案例类?

json - Apache Spark 读取带有额外列的 JSON

Scala Slick - 将 TableQuery[E] 转换为 Query[E] 以链式操作

java - Playframework 2.4 Java - 默认 "play-java"模板需要 1 分钟以上才能运行/不热重载

java - Playframework DynamicForm 总是空值

java - 无法在 Mac OsX 上设置环境变量

json - 如何从空的嵌套对象和空数组中清除 json

postgresql - Play 2.5 + Slick application.conf 配置错误与 URL

Scala:尝试 .getOrElse 与 if/else