7

Ich schreibe Scala/Play 2.0-Anwendung, und ich möchte, dass mein Code je nach Anfrage andere Seite zurückgibt. Hier ist mein Code:Wie können Parameter funktional validiert werden?

// 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(...) 
    } 

}

Das Problem entsteht, wenn eine Anfrage fehlerhaft ist und einige Header fehlen, dann NoSuchElementException geworfen wird.

In imperativen Sprache, würde ich jeden Schritt wie folgt bestätigen:

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

... 

aber was soll ich tun, ein solches Problem in einer funktionalen Weise zu lösen?

Antwort

16

Sie können authHeader.get(key) verwenden, die eine Option [B] zurückgibt. Ihr Code dann würde wie folgt aussehen:

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) 

Erläuterung:

Der gesamte Ausdruck wird nur dann ausgeführt werden, wenn es kein None Wert ist. Wenn also alle Header vorhanden sind, erhalten Sie einen result von Some[A] und wenn einer oder mehrere nicht vorhanden sind, erhalten Sie None. result.getOrElse(Unauthorized) gibt den enthaltenen Wert für Some[A] und Unauthorized für None zurück.

+0

Danke, es ist genau das, was ich gesucht habe. – lambdas

Verwandte Themen