7

私はScala/Play 2.0アプリケーションを作成しています。要求に応じてコードを別のページに戻したいと思います。 機能的な方法でパラメータを検証する方法は?

// Validate client and return temporary credentials 
def requestToken = Action { request => 
    // Authorization header may present or not 
    val authHeader = parseHeaders(request headers AUTHORIZATION) 
    // Authorization header may contain such keys or not 
    val clientKey = authHeader("oauth_consumer_key") 
    val signature = authHeader("oauth_signature") 

    if (authenticateClient(clientKey, signature)) { 
    ... 
    Ok(...) 
    } else { 
    Unauthorized(...) 
    } 

}

要求が不正な形式であり、いくつかのヘッダが欠落しているときに問題が発生したが、その後はNoSuchElementExceptionが

がスローされます。ここに私のコードです。命令型言語で

、私はこのようなすべてのステップを検証します:

if (!request.headers.contains(AUTHORIZATION)) 
    return Unathorized 

val authHeader = parseHeaders(request headers AUTHORIZATION) 

if (!authHeader.contains("oauth_consumer_key") || !authHeader.contains("oauth_signature")) 
    return Unathorized 

val clientKey = authHeader("oauth_consumer_key") 
val signature = authHeader("oauth_signature") 

... 

を私は機能的な方法でこのような問題を解決するために何をすべきでしょうか?

答えて

16

authHeader.get(key)を使用すると、オプション[B]が返されます。あなたのコードは次のようになります:

val result = for { 
    auth <- request.headers.get(AUTHORIZATION) 
    authHeader = parseHeaders(auth) 
    clientKey <- authHeader.get("oauth_consumer_key") 
    signature <- authHeader.get("oauth_signature") 
} yield { ... } 

result.getOrElse(Unauthorized) 

説明:None値がない場合

式全体がのみ、実行されます。したがって、すべてのヘッダーが存在する場合はresultSome[A]になり、1つ以上が存在しない場合はNoneになります。 result.getOrElse(Unauthorized)はとUnauthorizedの値をNoneとして返します。

+0

ありがとう、それは私が探していたものです。 – lambdas

関連する問題