scala - 如何以功能方式验证参数?

标签 scala functional-programming playframework playframework-2.0

我正在编写 Scala/Play 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(...)
  }

}

当请求格式错误并且缺少某些 header 时会出现问题,然后抛出 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")

...

但是我应该怎么做才能以功能方式解决这样的问题?

最佳答案

您可以使用 authHeader.get(key)它返回一个选项[B]。您的代码将如下所示:

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 的情况下才会执行整个表达式值(value)。因此,如果所有标题都存在,您将获得 resultSome[A]如果缺少一个或多个,您将收到 None . result.getOrElse(Unauthorized)将返回 Some[A] 的包含值和 UnauthorizedNone .

关于scala - 如何以功能方式验证参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11045013/

相关文章:

java - 在 Play Framework 中使用 renderJSON 时排除数据成员

scala - 使用 Spark 窗口函数计算移动平均值时丢弃前几个值

performance - Scala Futures 有很多内核,速度很慢

function - Clojure 记录实现 IFn 是一个好习惯吗?

python - 为什么多处理模块可以pickle调用匿名函数的函数?

java - Tomcat 7 多部分表单数据

scala - 将多个文件作为独立的 RDD 并行处理

Scala 2.8 和 Lift 状态

javascript - 是否可以定义中缀函数?

authentication - Play Framework 句柄授权而不是身份验证