2013-03-28 66 views
5

我正在嘗試向Pusher api發送一個請求,但我無法返回正確的類型,我類型不匹配;實測值:scala.concurrent.Future [play.api.libs.ws.Response]需要:play.api.libs.ws.Response類型不匹配;發現:scala.concurrent.Future [play.api.libs.ws.Response]必需:play.api.libs.ws.Response

def trigger(channel:String, event:String, message:String): ws.Response = { 
val domain = "api.pusherapp.com" 
val url = "/apps/"+appId+"/channels/"+channel+"/events"; 
val body = message 

val params = List( 
    ("auth_key", key), 
    ("auth_timestamp", (new Date().getTime()/1000) toInt), 
    ("auth_version", "1.0"), 
    ("name", event), 
    ("body_md5", md5(body)) 
).sortWith((a,b) => a._1 < b._1).map(o => o._1+"="+URLEncoder.encode(o._2.toString)).mkString("&"); 

    val signature = sha256(List("POST", url, params).mkString("\n"), secret.get); 
    val signatureEncoded = URLEncoder.encode(signature, "UTF-8"); 
    implicit val timeout = Timeout(5 seconds) 
    WS.url("http://"+domain+url+"?"+params+"&auth_signature="+signatureEncoded).post(body 
} 

回答

4

請求你使用post是異步的。該調用立即返回,但不返回Response對象。而是返回一個Future[Response]對象,一旦http請求異步完成,該對象將包含Response對象。

如果你想,直到請求完成阻斷執行,做:

val f = Ws.url(...).post(...) 
Await.result(f) 

查看更多有關期貨here

+0

在99%的情況下,您不應該等待異步。與未來一起工作的所有必要工具在框架中都是不可分割的。 –

+0

這不是你正在尋找的解決方案... –

+0

感謝Marius和Julien,你是對的,這會導致阻塞響應 – flubba

3

只要追加一個map

WS.url("http://"+domain+url+"?"+params+"&auth_signature="+signatureEncoded).post(body).map(_) 
+0

謝謝回答,你能解釋一下爲什麼這個工作?我的意思是,未來的價值是如何提取的? – flubba

3

假設您不想創建阻止應用程序,您的方法也應該返回Future[ws.Response]。讓您的期貨氣泡上升到控制器,您使用Async { ... }返回AsyncResult,讓Play處理剩下的事情。

控制器

def webServiceResult = Action { implicit request => 
    Async { 
    // ... your logic 
    trigger(channel, event, message).map { response => 
     // Do something with the response, e.g. convert to Json 
    } 
    } 
} 
+0

我無法在2.1 api中找到Async {}:http://www.playframework.com/ documentation/api/2.1.0/scala/index.html#package – flubba

+0

哪個庫可以導入以使用異步?它與AsyncResult有什麼不同? 我目前導入這兩個,這可能與: '進口scala.concurrent._ 進口play.api.libs.concurrent.Execution.Implicits._' 感謝 – flubba

+0

它在這裏https://github.com/ playframework/Play20/BLOB /主/框架/ src目錄/播放/ src目錄/主/斯卡拉/播放/ API/MVC/Results.scala#L669。只需導入'play.api.mvc._' –

相關問題