Реализация WS в последней игровой среде 2.5.10 в Scala

Я хочу ударить GET API-запрос с использованием новейших игровых рамок в Scala. Я думаю, что вариант использования для службы ws изменен в Play 2.5+. Я использую следующий код.

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

1 ответ

В вашем коде так много неправильных вещей, но давайте предположим, что вы хотите, чтобы 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, вы должны сделать Await на getApiResult.

Другие вопросы по тегам