7

Scala/Play 2.0 uygulamasını yazıyorum ve isteğime bağlı olarak kodumun farklı sayfa döndürmesini istiyorum. Parametreler nasıl işlevsel bir şekilde doğrulanır?

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

}

isteği hatalı biçimlendirilmiş ve bazı başlıklar eksik olduğunda sorun ortaya ardından NoSuchElementException

atılır: İşte benim kodudur. zorunlu dilinde

, böyle her adımı geçerli kılacak:

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

... 

ama işlevsel bir şekilde böyle bir sorunu çözmek için ne yapmalıyız?

cevap

16

Bir Seçenek [B] döndüren authHeader.get(key)'u kullanabilirsiniz. Kodunuz sonra böyle görünecektir:

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) 

Açıklama: hayır None değer yoksa

bütün ifadesi sadece çalıştırılacaktır. Bu nedenle, tüm üstbilgiler mevcutsa,, Some[A] alırsınız ve bir veya daha fazla yok ise, None alırsınız. result.getOrElse(Unauthorized), ve Unauthorized için None için bulunan değeri döndürecektir.

+0

Teşekkür ederim, tam da aradığım şey bu. – lambdas

İlgili konular