我对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响应,但有人可以解释实际发生了什么,是否有办法重构它以使其更具可读性?
答案 0 :(得分:2)
Dislaimer:我不熟悉这段代码。我的回复是尝试帮助破译方法调用,以帮助您更好地理解它。
这种方法似乎做了两件事。
身份验证和速率限制 - 由
完成authenticatedPublicApiPostArticleAction andThen rateLimitedApiAction
注意andThen
用于从左到右组合功能。因此,首先进行身份验证,然后进行速率限制
Asynchrnous JSON解析:
async(BodyParsers.parse.tolerantJson)
尝试将HTTP请求的主体解析为关于传入的Content-Type标头的JSON。
身体验证:
request.body.validate[ArticlePostQuery]
这似乎是验证正文(JSON)匹配ArticlePostQuery
的结构(我假设是一个案例类)。
validate方法返回JsResult
,这是一个ADT(代数数据类型),可以是JsSuccess
或JsError
。 fold
方法用于处理错误情况(第一个函数)或成功情况(第二个函数)。
根据结果行事:
如果前者发生,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结果。