2013-01-08 3 views
2

다음 코드를 사용하여 컴파일 할 때 오류가 발생합니다. 웹 서비스를 호출하려고합니다.웹 서비스 호출에서 Scala Play2 오류가 발생했습니다.

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) 
     } 

} 

나는 다음과 같은 컴파일러 오류보고 있어요 : 값이 authenticate 함수에서 반환되는

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

답변

2

하는 유형 Future[Response]이다 val request = ...하지만 기능은 컴파일러가 말한다 같은 String 기대 형식 불일치 오류입니다. 함수의 반환 유형을 Future[Response]으로 변경하거나 requestString으로 변환하여 반환해야합니다.

2

브라이언은 다음과 같이 말합니다. String을 반환하겠다고 말했을 때 브라이언은 현재 Future[String]을 반환합니다.

요청이 비동기 호출이기 때문에 Future을 반환합니다.

  1. Future[String]를 반환하기 위해 메서드 정의를 변경하고 (.map()과) 다른 방법이 미래를 관리

  2. 이 결과를 얻기 위해 요청을 강제로 :

    그래서, 당신은 두 가지 대안이 즉시으로 동기화됩니다. 매우 좋은 거래는 아니지만 때로는 가장 간단한 솔루션입니다.

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