2012-02-13 10 views
8

Estoy evaluando la posibilidad de usar Play2-mini con Scala para desarrollar un servicio que se ubicará entre un cliente móvil y un servicio web existente. Estoy buscando el ejemplo más simple posible de un fragmento de código donde Play2-mini implementa un servidor y un cliente. Idealmente, el cliente usará actores Akka2.Play2-mini y Akka2 para la puerta de enlace HTTP

Con esta pregunta, estoy tratando de averiguar cómo se hace, pero también para ver cómo Play2-Mini y Akka2 deberían cooperar. Desde Play2-Mini parece ser el reemplazo de los módulos de Akka HTTP.

Play2-mini contiene el siguiente ejemplo de código, en el que creé dos TODO. Si alguien puede ayudarme con un código de muestra para comenzar, estaré realmente agradecido.

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

Avísame si mi respuesta no es lo que esperaba y necesita algunas modificaciones. O aclarar si me perdí el punto. Es posible que haya pensado que necesitaba utilizar actores explícitamente para su puerta de enlace HTTP, pero no es el caso. La forma más simple es usar 'Async' y' play.api.libs.ws.WS' y dejar que Play framework administre los actores de Akka. – romusz

+0

Gracias por la amable ayuda @romusz. La respuesta parece perfecta ;-) pero no he tenido la oportunidad de implementarlo en mi servidor, por lo que mi respuesta fue un poco lenta. Algo más aterrizó en mi mesa, pero lo abordaré dentro de uno o dos días. Gracias de nuevo. – Jack

+0

Me alegro de poder ayudar. – romusz

Respuesta

7

Aquí está la implementación de su ejemplo.

Añadir las siguientes importaciones:

import play.api.libs.ws.WS 
import play.api.mvc.BodyParsers.parse 
import scala.xml.XML 

Añada la siguiente ruta:

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

Todo lo que hace, está enviando una petición a un GET serivce back-end como una solicitud POST. El servicio de fondo se especifica en el parámetro de solicitud como target y el cuerpo para la solicitud POST se especifica en el parámetro de solicitud como data (debe ser XML válido). Como extra, la solicitud se maneja de forma asíncrona (por lo tanto, Async). Una vez que se recibe la respuesta del servicio de fondo, el servicio de front-end responde con un código HTML básico que muestra la respuesta del servicio de fondo.

Si desea utilizar solicitud cuerpo, sugeriría la adición de la POST siguiente ruta en lugar de GET (de nuevo, en este órgano de aplicación debe ser un XML válido):

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

Así como se puede ver, para su HTTP Gateway puede usar Async y play.api.libs.ws.WS con Akka debajo del capó trabajando para proporcionar un manejo asíncrono (no se requieren actores explícitos). Buena suerte con tu proyecto Play2/Akka2.

+0

Buena respuesta, gracias. – Jack

1

Gran respuesta por romusz

Otra forma de hacer una solicitud (bloqueo) 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) 
Cuestiones relacionadas