Web服务调用上的Scala Play2错误

时间:2013-01-08 05:54:58

标签: web-services scala playframework playframework-2.0

我在使用以下代码编译时遇到错误。 我正在尝试调用Web服务。

def authenticate(username: String, password: String): String = {
    val request: Future[Response] = 
      WS.url(XXConstants.URL_GetTicket)
          .withTimeout(5000)
          .post( Map("username" -> Seq(username), "password" -> Seq(password) ) )            
      request map { response => 
        Ok(response.xml.text)
      } recover {
        case t: TimeoutException => 
          RequestTimeout(t.getMessage)
        case e =>
          ServiceUnavailable(e.getMessage)
      }

}

我看到以下编译器错误:

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

2 个答案:

答案 0 :(得分:2)

authenticate函数返回的值是val request = ...,类型为Future[Response],但函数需要String,正如编译器所说的那样是类型不匹配错误。在返回之前将函数的返回类型更改为Future[Response]或将request转换为String应修复它。

答案 1 :(得分:2)

就像Brian说的那样,当你的方法表示你要返回Future[String]时,你正在返回String

请求返回Future,因为它是异步调用。

所以,你有两种选择:

  1. 更改方法定义以返回Future[String],并使用其他方法管理此未来(使用.map()

  2. 强制请求以同步方式立即获取此结果 。这不是一个很好的协议,但有时它是最简单的解决方案。

    import scala.concurrent.Await
    import scala.concurrent.duration.Duration
    val response: String = Await.result(req, Duration.Inf)