2014-10-06 3 views
9

ich diesen einfachen Test Scala Anwendung haben, die eine blockierende HTTP-Anforderung:wie eine Scala Standalone-Anwendung, die die playframework Bibliotheken verwendet

build.sbt

name := "hello" 

version := "1.0" 

scalaVersion := "2.11.2" 

libraryDependencies += "com.typesafe.play" %% "play-ws" % "2.4.0-M1" 

Test.scala

import play.api.libs.json._ 
import play.api.libs.ws._ 
import scala.concurrent.duration.Duration 
import scala.concurrent.{Await, Future} 

object Test { 
    def main(args: Array[String]) = { 
    val wsClient = WS.client 
    val body = getBody(wsClient.url("http://example.com/").get()) 
    println(s"body: $body") 
    } 

    def getBody(future: Future[WSResponse]) = { 
    val response = Await.result(future, Duration.Inf); 
    if (response.status != 200) 
     throw new Exception(response.statusText); 
    response.body 
    } 
} 

Diese Anwendung schlägt fehl mit: Ausnahme im Thread "main" java.lang.RuntimeException: Es wurde keine Anwendung

gestartet

Wie löst man dieses Problem?

Antwort

13

EDIT für Play 2,5:

import akka.actor.ActorSystem 
import akka.stream.ActorMaterializer 
import play.api.libs.ws._ 
import play.api.libs.ws.ahc.AhcWSClient 

import scala.concurrent.Future 

object Main { 
    import scala.concurrent.ExecutionContext.Implicits._ 

    def main(args: Array[String]): Unit = { 
    implicit val system = ActorSystem() 
    implicit val materializer = ActorMaterializer() 
    val wsClient = AhcWSClient() 

    call(wsClient) 
     .andThen { case _ => wsClient.close() } 
     .andThen { case _ => system.terminate() } 
    } 

    def call(wsClient: WSClient): Future[Unit] = { 
    wsClient.url("http://www.google.com").get().map { response => 
     val statusText: String = response.statusText 
     println(s"Got a response $statusText") 
    } 
    } 
} 

Bitte sehen:

für detailliertere Beispiele für Standalone WSClient Nutzung. Wenn Sie von früheren Versionen migrieren, finden Sie https://www.playframework.com/documentation/2.5.x/Migration25#Play-WS-upgrades-to-AsyncHttpClient-2

Für Wiedergabe 2.4:

nicht roh AsyncHttpClientConfig.Builder für HTTPS verwenden Sie - es ist nicht einen sicheren SSL-Kontext mit dem Hostnamen Validierung nicht konfigurieren.

Sie können eine neue WSClient Instanz mit dem folgenden Code erstellen:

import play.api.libs.ws.ning._ 
import play.api.libs.ws._ 

val config = new NingAsyncHttpClientConfigBuilder(DefaultWSClientConfig()).build() 
val builder = new AsyncHttpClientConfig.Builder(config) 
val wsClient:WSClient = new NingWSClient(builder.build()) 

Bitte beachten Sie, dass dies bis Threads beginnen, die nicht geschlossen werden, bis Sie den Client schließen:

wsClient.underlying[NingWSClient].close() 

und Sie können zu Speicherverlusten kommen, wenn Sie es nicht schließen.

+0

Das deutlichste Beispiel dafür, wie dies zu tun, das ich je gesehen habe Danke, Will. –

+0

alles ist jetzt veraltet in 2.5.x. – ses

+0

Hi @ses - bitte siehe https://www.playframework.com/documentation/2.5.x/ScalaWS#using-wsclient und https://www.playframework.com/documentation/2.5.x/ScalaTestingWebServiceClients –

4

Eine gestartete PlayApplication enthält eine Client-Instanz, which WS.client simply points to it. Da Sie nicht eine Play-Anwendung starten, Sie haben Ihren eigenen Client erstellen, wie folgt aus:

val client = { 
    val builder = new com.ning.http.client.AsyncHttpClientConfig.Builder() 
    new play.api.libs.ws.ning.NingWSClient(builder.build()) 
} 
client.url("http://example.com/").get() 

Werfen Sie einen Blick auf my project für ein ähnliches usecase, ich spiele-ws bin mit und Play-json, ohne Spiel selbst.

8

Play 2.4 macht es sehr einfach, WS in einer Standalone-App zu verwenden.

Die folgende gist bietet ein schönes Arbeitsbeispiel und die folgende blog post bietet eine nette Erklärung.

Hier sind die Highlights.

Konfiguration konfigurieren.sbt

libraryDependencies ++= Seq(
    "com.typesafe.play" %% "play-ws" % "2.4.0-M2" 
) 

Initialisieren Sie den WS-Client

val config = new NingAsyncHttpClientConfigBuilder(DefaultWSClientConfig()).build 
val builder = new AsyncHttpClientConfig.Builder(config) 
val client = new NingWSClient(builder.build) 

Verwenden WS

client.url("http://www.example.com").get 

Mitteilung WS Ressourcen

client.close()