2015-04-08 3 views
0

У меня есть приложение, в котором используется игра 2.3.8, scala и (если это имеет значение) play-auth.Play2, scala: как использовать результат контроллера от другого контроллера?

Есть контроллер, с помощью метода:

def foo(id: Long) = StackAction(AuthorityKey -> Everybody) { implicit request => 
    //code forming json 
    Ok(json) 
} 

Как я могу получить, что JSON из другого контроллера? я пытаюсь что-то, но без успеха:

def bar(id : Long) = StackAction(AuthorityKey -> Everybody){ implicit request => 
    val futureResponse = AnotherController.foo(id).apply(request) 
    val result = Await.result(futureResponse, Timeout(5, TimeUnit.SECONDS).duration) 
    Logger.debug("_______________________" + result.body) //dont't know how to convert that to json 
    //handle json there 
    Ok(newResult) 
} 

Как сделать это правильно?

+2

В результате тело является 'Enumerator [Array [Byte]]', которые могли бы на самом деле не делать перечисления. Вам придется заставить его перечислить данные, нажав на «Итератет». Что-то вроде 'result.body | >>> Iteratee.foreach (println)' - но это все равно будет печатать байты, поэтому вам нужно будет преобразовать в 'String', и он, вероятно, будет разбит на разделы. почему ты хочешь сделать это? –

+3

Кстати, создание контроллеров, зависящих друг от друга, не самая лучшая идея. Вы можете поместить общую логику где-нибудь и использовать ее из контроллеров. –

ответ

0

Попробуйте

def bar(id : Long) = StackAction(AuthorityKey -> Everybody){ implicit request => 

     val futureResponse: Future[JsValue] = 
      AnotherController.foo(id).apply(request).flatMap{ res => 
       res.body |>>> Iteratee.consume[Array[Byte]]() 
      }.map(bytes => Json.parse(new String(bytes,"utf-8"))) 

     val json = Await.result(futureResponse, Timeout(5, TimeUnit.SECONDS).duration) 
     Logger.debug("_______________________" + json) //dont't know how to convert that to json 
     //handle json there 
     Ok(json) 
    } 
+0

Возможно, вы захотите запустить 'res.body' через' Results.dechunk' 'Enumeratee'. В противном случае фрагментированный ответ не будет разбираться с JSON. то есть. 'res.body &> Results.dechunk | >>> ....' –