7

मैं स्कैला/प्ले 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) का उपयोग कर सकते हैं जो एक विकल्प [बी] देता है। आपका कोड तो कुछ इस तरह दिखेगा:

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] मिलेगा और यदि एक या अधिक अनुपस्थित हैं, तो आपको None मिल जाएगा। result.getOrElse(Unauthorized) के लिए Some[A] और Unauthorized के लिए निहित मान वापस कर देगा।

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। – lambdas