1

因此,在 playframework 中,我可以流回任何响应,因此当我收到 json 请求时,我可以进行 http 分块并将响应流回以获取一些非常大的响应。我想知道是否可以在 POST 调用上执行相同的操作。如果客户有一个非常非常大的 POST 调用,他们可以向我发送请求吗?这可以用html吗?

也就是说,如果我不能这样做,我需要一个 api,curl 或其他一些非浏览器客户端将使用它来上传文件(json 请求或 csv 等)。如何创建这样的api?

我应该注意,我不能一次收到整个请求,否则会内存不足。我需要接收片段,当我收到片段时,一次将其放入后端数据存储区。

此外,curl 语法是什么,以确保它正在流式传输文件,而不是在一个会破坏服务器的巨大请求中发送它?如何强制客户端将文件流式传输?

谢谢,院长

4

1 回答 1

0

您可以使用EssentialAction完全控制 HTTP 请求处理。EssentialAction 处理请求正文并返回结果。

Normal Play Action是 EssentialAction 的一个特例。Actions 处理请求正文并返回结果,但它们总是分两步执行它们的处理。操作首先解析请求正文。然后Actions将解析后的值解析为一个函数,得到一个Result。对你来说,有一个单独的解析步骤是个问题,因为这意味着解析后的值需要存储在内存中。

如果您使用 EssentialAction,那么您可以避免将解析后的值存储在内存中,因为您可以在请求正文到达时对其进行处理。

您需要做的是向您的控制器添加一个返回 EssentialAction 的方法。

EssentialAction 的签名是:

trait EssentialAction extends (RequestHeader) ⇒ Iteratee[Array[Byte], SimpleResult] 

EssentialAction 需要接受请求头,然后返回一个 iteratee 来处理请求体。iteratee 将在请求主体到达时增量处理它。您可以使用 iteratee 在每件到达时将每件放入您的数据存储中。处理完所有部分后,您可以返回一个结果。

更多信息在这里:http ://www.playframework.com/documentation/2.2.x/HttpApi 。

于 2014-02-01T10:41:48.090 回答