2013-03-28 12 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], который будет содержать объект Response, как только HTTP-запрос будет выполнен асинхронно.

Если вы хотите, чтобы блокировать выполнение, пока запрос не будет завершен, сделайте следующее:

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

Подробнее о фьючерсах here.

+0

В 99% случаях вы не должны ждать Async. Все необходимые инструменты для работы с будущим в этой структуре являются несвязанными. –

+0

Это не решение, которое вы ищете ... –

+0

спасибо Мариус и Жюльен, вы правы, это вызывает блокирующий ответ – flubba

3

Просто добавьте в map:

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

спасибо за ответ на, вы можете объяснить, почему это работает? Я имею в виду, как ценность извлекается из будущего? – flubba

3

Предполагая, что вы не хотите создавать блокирующее приложение, ваш метод также должен вернуть Future[ws.Response]. Пусть ваши фьючерсы подпрыгнут до Контролера, где вы вернете AsyncResult, используя Async { ... } и позвольте 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

Я не смог найти Async {} в 2.1 api: http://www.playframework.com/ документация/api/2.1.0/scala/index.html # пакет – flubba

+0

, какую библиотеку я импортирую для использования Async? Как это отличается от AsyncResult? я импортируют эти два, которые могут быть связаны: 'импорт scala.concurrent._ импорт play.api.libs.concurrent.Execution.Implicits._' благодаря – flubba

+0

Это здесь https://github.com/ playframework/Play20/BLOB/Master/рамки/SRC/воспроизведение/SRC/главная/Scala/воспроизведение/API/MVC/Results.scala # L669. Просто импортируйте 'play.api.mvc._' –

Смежные вопросы