簡體   English   中英

在另一個函數中播放Framework Action.async WS

[英]Play Framework Action.async WS within another function

使用Play 2.3將Web服務合並到Action中時,我遇到了一些難題。 在此“ ping”操作中,我首先檢查請求者是否具有會話令牌。 如果它們這樣做,則應用程序將字符串“ pong”返回給瀏覽器。

  def ping = Action { request =>
    request.session.get("token") match {
      case Some(token) => {
        Ok("pong")
      } case None => Unauthorized("error")  
    } 
  }

現在,如果在這樣的操作中向另一個Web服務添加調用:

  def ping = Action.async { request =>
    request.session.get("email") match {
      case Some(email) => {
        WS.url("http://localhost:8080/ping").get.map { response =>
          Ok(response.json.as[JsString].value)
        }
      } case None => Unauthorized("error")  
    } 
  }

我最終不匹配,“無”(沒有會話令牌的人)的匹配器不在Future中。

  type mismatch; found : play.api.mvc.Result required: scala.concurrent.Future[play.api.mvc.Result]

現在,我唯一的選擇是擺脫開關中的“ ”。 編譯器警告我該邏輯易於出錯...但是它將進行編譯。 我假設我在這里做錯了一切,包括異步ws調用和會話變量處理。

誰能建議我如何解決此ping操作,以便它可以處理會話變量和異步開關。 我才剛剛開始掌握Scala並發/未來。

Action.async期望使用Future[Result] ,但是Unauthorized("error")只是一個Result 您可以通過使其成為成功的Future來解決此問題。

def ping = Action.async { request =>
    request.session.get("email") match {
        case Some(email) => {
            WS.url("http://localhost:8080/ping").get.map { response =>
                Ok(response.json.as[JsString].value)
            }
        } 
        case None => Future.successful(Unauthorized("error"))
    } 
}

case None替換為:

// ...
case None => Future.successful(Unauthorized("error"))

因此,在兩種情況下,類型都將是結果的未來(成功返回HTTP錯誤作為結果)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM