2017-04-08 41 views
0

我想在scala中使用最新的play framework打到GET api請求。我認爲用於ws服務的用例在Play 2.5+中發生了變化。我正在使用以下代碼。在scala中最新的play framework 2.5.10中實現WS

class ApiResult @Inject() (ws: WSClient) { 

    def getApiResult(param1: String, param2: String)= { 

    var response = ws.url(s"ip-address/getApiResult/${param1}/${param2}").withRequestTimeout(5000.millis).get() 
    var i = 0 
    while(i < 2 && !response.isCompleted){ 
    response = ws.url(s"ip-address/getSmsCredit/${param1}/${param2}").withRequestTimeout(5000.millis).get() 
    i += 1 
    } 

    val result = response.onComplete { 
    case Success(jsonOutput) => 
     val x= (jsonOutput.json \ "x").getOrElse(Json.toJson(-1)).as[Double] 
     val y= (jsonOutput.json \ "y").getOrElse(Json.toJson(-1)).as[Double] 
     val z= (jsonOutput.json \ "z").getOrElse(Json.toJson(-1)).as[Double] 

     SomeCaseClass(x, y, z) 
    case _ => 
    Logger.info("Error") 
    SomeCaseClass(0.00, 0.00, 0.00) 
    } 
    result 
} 
} 

我想基本上返回SomeCaseClass,當我在其他函數中調用getApiResult。另外,如何在那裏調用這個函數,因爲這個函數使用參數WSClient

回答

0

你的代碼中有太多錯誤的東西,但是讓我們假設你想要一個Future從這個方法返回,你應該這樣做:

def getApiResult(param1: String, param2: String): Future[SomeCaseClass] = { 
    ws.url(s"ip-address/getApiResult/${param1}/${param2}") 
    .withRequestTimeout(5000.millis).get() 
    .flatMap(_ => //Will get here after the first request finished 
     ws.url(s"ip-address/getSmsCredit/${param1}/${param2}") 
     .withRequestTimeout(5000.millis).get() 
     .map(_.body.validate[SomeCaseClass] 
       .asOpt 
       .getOrElse(SomeCaseClass(0.00, 0.00, 0.00))) 
) 
} 

您需要實現一個隱含的讀者:

object SomeCaseClass{ 
    implicit val reads: Reads[SomeCaseClass] = (
    (__ \ "x").read[Double] and 
     (__ \ "y").read[Double] and 
     (__ \ "z").read[Double] 
    )(SomeCaseClass.apply _) 
} 

如果你想實際SomeCaseClass,你對對子級做getApiResult等待。

+0

Hey Tomer,謝謝你的回答,實際上我提出了超過1個請求,以防萬一第一次請求超時。之前,我在初始化WSClient時遇到了問題,所以後來我在我的主控制器本身中注入了WSClient,而不是使用該WSClient初始化此類。比,它工作得很好。 –

相關問題