Play Framework 2.5 Move Action.Async逻辑从控制器到服务



我有一个具有许多业务逻辑的控制器,我想将代码移动 action.async 代码的块。此代码有效,我如何转到另一个类(服务)操作中的代码?

def tweetsnew(query: String) = Action.async {
// Move From Here...
credentials.map {
  case (consumerKey, requestToken) =>
    ws.url("https://api.twitter.com/1.1/search/tweets.json")
      .sign(OAuthCalculator(consumerKey, requestToken))
      .withQueryString("q" -> query)
      .withQueryString("max_id" -> "833342796736167936")
      .get().map { twitterResponse =>
      if (twitterResponse.status == 200) {
        // Here There Are More Complex Logic
        Ok("That is fine: "+twitterResponse.body)
      } else {
        throw new Exception(s"Could not retrieve tweets for $query query term")
      }
    }
}.getOrElse {
  Future.failed(new Exception("You did not correctly configure the Twitter credentials"))
}
//....To Here. To Another Class
}

我已经检查了文档,这与创建未来[结果]有关,但我无法使该函数返回与Action.Async期望的相同类型。

Action.async期望Future[Result]的返回类型,因此您需要创建一个返回Future[Result]

的函数

第一步,将代码提取到功能:

object TwitterService {
  def search(query: String, consumerKey: ConsumerKey, requestToken: RequestToken)(implicit ws: WSClient, ec: ExecutionContext): Future[Result] = {
    // your code that make the ws call that returns Ok("...")
  }
 }

然后在控制器中调用您的功能:

def tweetsnew(query: String) = Action.async {
  credentials.map {
    case (consumerKey, requestToken) => TwitterService.search(query, consumerKey, requestToken)
  }.getOrElse {
    // Better to send a bad request or a redirect instead of an Exception
    Future.successful(BadRequest("Credentials not set"))
  }
}

最新更新