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],如果有一個或多個標題不存在,您將獲得Noneresult.getOrElse(Unauthorized)將返回Some[A]Unauthorized的包含值None

+0

謝謝,這正是我一直在尋找的。 – lambdas