8

Play2-miniをScalaで使用して、モバイルクライアントと既存のWebサービスの間に位置するサービスを開発する可能性を評価しています。Play2-miniがサーバーとクライアントを実装するコードの最も単純な例を探しています。理想的には、クライアントはAkka2アクターを使用します。

この質問では、それがどのように行われるかを調べようとしていますが、Play2-MiniとAkka2がどのように連携する必要があるかについても調べています。Play2-MiniはAkkaHTTPモジュールの代わりになるようです。

Play2-miniには、次のコード例が含まれています。このコード例では、2つの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 ゲートウェイを使用Asyncplay.api.libs.ws.WSて、内部で Akka を使用して非同期処理を提供できます (明示的なアクタは必要ありません)。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 に答える