7

Sto scrivendo un'applicazione Scala/Play 2.0 e desidero che il mio codice restituisca una pagina diversa a seconda della richiesta. Ecco il mio codice:Come convalidare i parametri in modo funzionale?

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

}

Il problema si pone quando richiesta non è valido e alcune intestazioni sono mancante, quindi NoSuchElementException viene generata.

Nel linguaggio imperativo, vorrei validare ogni passo in questo modo:

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

... 

ma cosa devo fare per risolvere tale problema in modo funzionale?

risposta

16

È possibile utilizzare authHeader.get(key) che restituisce un'opzione [B]. Il tuo codice allora sarebbe simile a questa:

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) 

Spiegazione: viene eseguita solo

l'intera espressione, se non v'è alcun valore None. Quindi se tutte le intestazioni sono presenti otterrai result di Some[A] e se uno o più sono assenti, riceverai None. result.getOrElse(Unauthorized) restituirà il valore contenuto per Some[A] e Unauthorized per None.

+0

Grazie, è esattamente quello che stavo cercando. – lambdas