使用scala语法作为参数

时间:2017-04-18 12:41:33

标签: scala playframework functional-programming

我对scala中的函数式编程相对较新。我遇到了流动的方法。我一直无法确切地知道它在做什么?

def getPostsByFilters = (authenticatedPublicApiPostArticleAction andThen rateLimitedApiAction).async(BodyParsers.parse.tolerantJson) { implicit request =>
    implicit val apiKey = Some(request.apiKey)
    request.body.validate[ArticlePostQuery] fold(
      errors => futureBadRequest(errors.toString()),
      articleQuery => verifyPostQueryParams(articleQuery, verifiedApiRequest => {
        val PostsNetwork = PostsNetwork(true, verifiedApiRequest.contentType, verifiedApiRequest.orderBy)
        apiArticleService.findApiArticlesWithPostRequest(verifiedApiRequest, PostsNetwork) map (articles => wrapUpResultsToJson(ApiPosts(articles)))
      }))
  }

它位于Play API控制器中,该方法映射到路径文件中的post请求。

我知道它需要一个json post请求并返回一个json响应,但有人可以解释实际发生了什么,是否有办法重构它以使其更具可读性?

1 个答案:

答案 0 :(得分:2)

Dislaimer:我不熟悉这段代码。我的回复是尝试帮助破译方法调用,以帮助您更好地理解它。

这种方法似乎做了两件事。

  1. 身份验证和速率限制 - 由

    完成
    authenticatedPublicApiPostArticleAction andThen rateLimitedApiAction
    

    注意andThen用于从左到右组合功能。因此,首先进行身份验证,然后进行速率限制

  2. Asynchrnous JSON解析:

    async(BodyParsers.parse.tolerantJson)
    

    尝试将HTTP请求的主体解析为关于传入的Content-Type标头的JSON。

  3. 身体验证:

    request.body.validate[ArticlePostQuery]
    

    这似乎是验证正文(JSON)匹配ArticlePostQuery的结构(我假设是一个案例类)。 validate方法返回JsResult,这是一个ADT(代数数据类型),可以是JsSuccessJsErrorfold方法用于处理错误情况(第一个函数)或成功情况(第二个函数)。

  4. 根据结果行事:

    如果前者发生,API会返回一个错误状态代码(我假设某种400错误请求,并带有错误:

    errors => futureBadRequest(errors.toString())
    

    如果后者发生,它会尝试验证所有查询参数是否存在:

    articleQuery => verifyPostQueryParams(articleQuery, verifiedApiRequest
    

    如果它们确实存在,则会调用以下thunk:

    val PostsNetwork = 
      PostsNetwork(
        true, 
        verifiedApiRequest.contentType, 
        verifiedApiRequest.orderBy
      )
    
    apiArticleService
      .findApiArticlesWithPostRequest(verifiedApiRequest, PostsNetwork) 
      .map(articles => wrapUpResultsToJson(ApiPosts(articles)))
    }))
    

    检索文章帖子。然后,它映射结果以从ApiPosts对象返回JSON结果。