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

时间:2015-10-21 16:01:20

标签: scala playframework

我在控制器中有一个动作,用于处理我的API中的JSON有效负载。

此JSON有效负载有时会变得太大,如果请求超过某个阈值,我也不想处理请求,让我们说1兆字节。

如果JSON是100兆字节,我是否被迫等待将整个JSON加载到内存中,或者我可以将流程短路,只需通过流体和计算大小来返回禁止响应,一旦它结束我的阈值我可以通过将整个100 MB加载到内存中来暂停/返回并且不会浪费我的服务器资源。

1 个答案:

答案 0 :(得分:2)

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

您可以通过为单个BodyParser设置Action来覆盖此值,以允许可以在内存中缓冲的最大长度。 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
    )
}

或者,如果要将此应用程序设置为范围,则可以使用以下配置选项:

播放2.0.x - 2.3.x

parsers.json.maxLength = 1m

播放2.4.x

play.http.parser.maxMemoryBuffer = 1m

Play Documentation - Body Parsers - Max content length