2014-10-06 16 views
9

Play Framework kütüphanelerini kullanan bir Scala bağımsız uygulama, bir engelleme http isteği var nasıl:Bu basit bir test Scala uygulamaya sahip

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

Bu uygulama ile başarısız: "ana" iş parçacığında özel durum java.lang.RuntimeException: Başlatılan uygulama yok

Bu sorunu nasıl çözebilirim?

cevap

13

DÜZENLEME:

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

bakınız: Tek başına WSClient kullanım daha ayrıntılı örnekler için

. Eğer önceki sürümlerden geçiş yapıyorsanız, Oynat 2.4 için https://www.playframework.com/documentation/2.5.x/Migration25#Play-WS-upgrades-to-AsyncHttpClient-2

bkz:

HTTPS için ham AsyncHttpClientConfig.Builder kullanmayın - bu makine adı doğrulama ile güvenli bir SSLContext'i yapılandırmaz.

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()) 

istemciyi kapatana kadar bu kapalı olmayacak konuları başlayacaktır lütfen unutmayın: Aşağıdaki kodu kullanarak yeni WSClient örneğini oluşturabilir

wsClient.underlying[NingWSClient].close() 

ve kapatmazsanız bellek sızıntılarına girebilirsiniz.

+0

Bunun nasıl en net örneğini başlat teşekkürler Will. –

+0

hepsi 2.5.x'te şimdi kullanımdan kaldırıldı. – ses

+0

Hi @ses - lütfen bkz. Https://www.playframework.com/documentation/2.5.x/ScalaWS#using-wsclient ve https://www.playframework.com/documentation/2.5.x/ScalaTestingWebServiceClients –

4

Başlarken PlayApplication, bir istemci örneği, which WS.client simply points to it içerir. Bir Play uygulamasını başlatmak olmayacağından, bu gibi kendi müşteri oluşturmak zorunda:

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() 

benzer USECASE my project üzerinde göz olmadan, Play-ws kullanıyorum ve play-json Kendini oyna. Oynat 2.5 için

8

Oynat 2,4, bağımsız bir uygulamada WS'yi kullanmayı çok kolaylaştırır.

Aşağıdaki gist güzel bir çalışma örneği sağlar ve aşağıdaki blog post güzel bir açıklama sağlar.

İşte önemli noktalar.

Yapılandırmayı yapılandırın.sbt

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

WS müşteriye

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

WS kullanarak

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

Yayın WS kaynakları gördüğüm

client.close() 
İlgili konular