2014-10-06 14 views
9

Tôi có ứng dụng thử nghiệm Scala đơn giản này, mà một yêu cầu chặn http:làm thế nào để có một ứng dụng độc lập Scala có sử dụng các thư viện play framework

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

ứng dụng này không thành công với: Ngoại lệ trong chuỗi "chính" java.lang.RuntimeException: Không có ứng dụng nào được bắt đầu

cách giải quyết vấn đề này?

Trả lời

13

EDIT cho Chơi 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") 
    } 
    } 
} 

Xin xem:

cho các ví dụ chi tiết hơn về việc sử dụng WSClient độc lập. Nếu bạn đang di chuyển từ phiên bản trước, xem https://www.playframework.com/documentation/2.5.x/Migration25#Play-WS-upgrades-to-AsyncHttpClient-2

Đối Chơi 2.4:

Không sử dụng AsyncHttpClientConfig.Builder liệu cho HTTPS - nó không cấu hình một SSLContext an toàn với xác nhận hostname.

Bạn có thể tạo một đối tượng WSClient mới sử dụng đoạn mã sau:

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

Xin lưu ý rằng điều này sẽ khởi động đề đó sẽ không được đóng cửa cho đến khi bạn đóng client:

wsClient.underlying[NingWSClient].close() 

và bạn có thể gặp phải rò rỉ bộ nhớ nếu bạn không đóng nó.

+0

Ví dụ rõ ràng nhất về cách để làm điều này mà tôi đã nhìn thấy , cảm ơn Will. –

+0

tất cả hiện không được chấp nhận trong 2.5.x. – ses

+0

Xin chào @ses - vui lòng xem https://www.playframework.com/documentation/2.5.x/ScalaWS#using-wsclient và https://www.playframework.com/documentation/2.5.x/ScalaTestingWebServiceClients –

4

Ứng dụng PlayApplication đã bắt đầu chứa một phiên bản ứng dụng khách, which WS.client simply points to it. Vì bạn sẽ không bắt đầu một ứng dụng Play, Bạn cần phải tạo ra khách hàng của riêng mình, như thế này:

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

Có một cái nhìn về my project cho usecase tương tự, tôi đang sử dụng play-ws và play-json, mà không Chơi chính nó.

8

Phát 2.4 giúp bạn dễ dàng sử dụng WS trong một ứng dụng độc lập.

gist sau đây cung cấp ví dụ hoạt động tốt và blog post sau đây cung cấp giải thích tốt đẹp.

Dưới đây là những điểm nổi bật.

Định cấu hình xây dựng.SBT

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

Khởi client WS

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

Sử dụng WS

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

nguồn phát hành WS

client.close() 
Các vấn đề liên quan