Реализация 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.