我在使用以下代码编译时遇到错误。 我正在尝试调用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
答案 0 :(得分:2)
从authenticate
函数返回的值是val request = ...
,类型为Future[Response]
,但函数需要String
,正如编译器所说的那样是类型不匹配错误。在返回之前将函数的返回类型更改为Future[Response]
或将request
转换为String
应修复它。
答案 1 :(得分:2)
就像Brian说的那样,当你的方法表示你要返回Future[String]
时,你正在返回String
。
请求返回Future
,因为它是异步调用。
所以,你有两种选择:
更改方法定义以返回Future[String]
,并使用其他方法管理此未来(使用.map()
)
强制请求以同步方式立即获取此结果 。这不是一个很好的协议,但有时它是最简单的解决方案。
import scala.concurrent.Await
import scala.concurrent.duration.Duration
val response: String = Await.result(req, Duration.Inf)