8

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

带着这个问题,我试图找出它是如何完成的,同时也想看看 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")
    }
  }
}
4

2 回答 2

7

这是您的示例的实现。

添加以下导入:

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路由而不是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 网关,您可以使用AkkaAsync并在底层工作以提供异步处理(不需要显式的 Actors)。play.api.libs.ws.WS祝你的 Play2/Akka2 项目好运。

于 2012-03-12T22:25:46.577 回答
1

romusz的好答案

发出(阻塞)HTTP GET 请求的另一种方法:

import play.api.libs.ws.WS.WSRequestHolder  
import play.api.libs.ws.WS.url  
import play.api.libs.concurrent.Promise  
import play.api.libs.ws.Response

val wsRequestHolder: WSRequestHolder = url("http://yourservice.com")  
val promiseResponse: Promise[Response] = wsRequestHolder.get()  
val response = promiseResponse.await.get

println("HTTP status code: " + response.status)
println("HTTP body: " + response.body)
于 2012-03-22T11:23:26.143 回答