我在控制器中有一个动作,用于处理我的API中的JSON有效负载。
此JSON有效负载有时会变得太大,如果请求超过某个阈值,我也不想处理请求,让我们说1兆字节。
如果JSON是100兆字节,我是否被迫等待将整个JSON加载到内存中,或者我可以将流程短路,只需通过流体和计算大小来返回禁止响应,一旦它结束我的阈值我可以通过将整个100 MB加载到内存中来暂停/返回并且不会浪费我的服务器资源。
答案 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