2

次のコードでコンパイルするとエラーが発生します。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
4

2 に答える 2

2

authenticate関数から返される値val request = ...はタイプですが、コンパイラーが言うように、関数はタイプの不一致エラーであるとFuture[Response]予想します。String関数の戻り型をに変更するか、関数を返す前にaにFuture[Response]変換すると、修正されるはずです。requestString

于 2013-01-08T06:25:05.490 に答える
2

Future[String]ブライアンと言うように、メソッドが。を返したいと言ったとき、あなたは現在、を返していStringます。

Future非同期呼び出しであるため、リクエストはを返します。

したがって、2つの選択肢があります。

  1. メソッド定義を変更してを返し、Future[String]この未来を別のメソッドで管理します(を使用して.map()

  2. 同期的に、この結果をすぐに取得するようにリクエストを強制します。それはあまり良い取引ではありませんが、時にはそれが最も簡単な解決策です。

    import scala.concurrent.Await
    import scala.concurrent.duration.Duration
    val response: String = Await.result(req, Duration.Inf)
    
于 2013-01-08T08:25:01.587 に答える