7

Escribo la aplicación Scala/Play 2.0 y deseo que mi código devuelva una página diferente según lo solicite. Aquí está mi código:¿Cómo validar los parámetros de una manera funcional?

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

}

El problema surge cuando la petición está mal formado y algunas cabeceras se encuentra, entonces NoSuchElementException se lanza.

En lenguaje imperativo, me validar cada paso de esta manera:

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

... 

pero lo que hay que hacer para resolver ese problema de una manera funcional?

Respuesta

16

Puede usar authHeader.get(key) que devuelve una Opción [B]. Su código a continuación, sería algo como esto:

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) 

Explicación:

Toda la expresión sólo se ejecutará, si no hay ningún valor None. Entonces, si todos los encabezados están presentes obtendrá un result de Some[A] y si uno o más están ausentes, obtendrá None. result.getOrElse(Unauthorized) devolverá el valor contenido para Some[A] y Unauthorized para None.

+0

Gracias, es exactamente lo que estaba buscando. – lambdas

Cuestiones relacionadas