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