scala - 如果发布的数据太大,您可以在操作中停止处理吗?

标签 scala playframework

我的 Controller 中有一个操作,用于处理 API 中的 JSON 负载。

这个 JSON 有效负载有时会变得太大,如果它超过某个阈值(比如说 1 兆字节),我就不想处理该请求。

如果 JSON 为 100 兆字节,我是否必须等待整个 JSON 加载到内存中,或者我是否可以短路该过程并通过流式传输正文并计算大小来返回禁止响应,一旦超过我可以停止/返回我的阈值,并且不会通过将整个 100 MB 加载到内存中来浪费我的服务器资源。

最佳答案

BodyParser 可以为您完成此操作。默认情况下,Play 的 BodyParser 在返回 413 错误(请求实体太大)之前仅接受 100KB 的数据。

您可以通过为单个 Action 设置 BodyParser 来覆盖此设置,以允许在内存中缓冲的最大长度。 parse.maxLength 可以将 BodyParser[A] 转换为 BodyParser[Either[MaxSizeExceeded, A]]

在本例中,我们需要 BodyParser[Either[MaxSizeExceeded, JsValue]]

def process() = Action(parse.maxLength(1024 * 1024, parse.json)) { request =>
    request.body.fold(
         maxExceeded => EntityTooLarge("Your request must be smaller than 1MB!"),
         json => // .. do something with JSON
    )
}

或者,如果您想在应用程序范围内设置此应用程序,可以使用配置选项来实现此操作:

Play 2.0.x - 2.3.x:

parsers.json.maxLength = 1m

Play 2.4.x:

play.http.parser.maxMemoryBuffer = 1m

Play Documentation - Body Parsers - Max content length

关于scala - 如果发布的数据太大,您可以在操作中停止处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264032/

相关文章:

scala序列化总是抛出异常,为什么?

scala - 如何用 mixin 实现 F 有界多态性?

scala - Scala中的类型删除

scala - 根据类型将值与函数匹配

scala - 如何使 Web 服务器运行 "constantly"?

scala - Compose 和 andThen 方法

java - 如何解决Play Framework中的空指针异常?

mysql - 使用单独的 OneToMany 创建 ManyToMany Join 表

scala - 在 Scala Play Framework v2.6.x 中出现 cors 错误

playframework - 在 Play 中放置@Transactional 注释的位置