7

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

}

この問題は、リクエストの形式が正しくなく、一部のヘッダーが欠落している場合に発生し、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")

...

しかし、そのような問題を機能的に解決するにはどうすればよいでしょうか。

4

1 に答える 1

16

authHeader.get(key)Option[B]を返すwhichを使用できます。その場合、コードは次のようになります。

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ます。したがって、すべてのヘッダーが存在する場合はresultのを取得し、Some[A]1つ以上が存在しない場合はを取得しNoneます。に含まれる値をresult.getOrElse(Unauthorized)返します。Some[A]UnauthorizedNone

于 2012-06-15T06:41:25.433 に答える