Mar*_*eon 7 java stream httpclient
我们使用HTTPClient来实现REST API.
我们正在使用以下方法读取服务器响应:
method = new PostMethod(url);
HttpClient client = new HttpClient();
int statusCode = client.executeMethod(method);
String responseBody = method.getResponseBodyAsString();
Run Code Online (Sandbox Code Playgroud)
当我们这样做时,我们得到这个警告:
Dec 9, 2009 7:41:11 PM org.apache.commons.httpclient.HttpMethodBase getResponseBody
WARNING: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
Run Code Online (Sandbox Code Playgroud)
该文档继续说:
HttpClient能够进行有效的请求/响应正文流.可以提交或接收大型实体而不在内存中缓冲.如果可以同时执行多个HTTP方法,这尤其重要.虽然有方便的方法来处理字符串或字节数组等实体,但不鼓励使用它们.除非小心使用,否则它们很容易导致内存不足,因为它们意味着在内存中缓冲整个实体.
所以我的问题是,如果你确实需要完整的响应作为字符串(即:存储在数据库中,或使用DOM解析),为什么使用流更节省内存?
mat*_*t b 13
使用流而不是将整个实体作为String更有效,因为后者意味着
如果您将响应作为流处理,那么您实际执行的操作是一次处理N个字节.这意味着您可以在远程服务器仍在发送下一段数据时开始处理第一个响应段.因此,如果您的用例允许您在接收数据时处理数据,则这更有意义作为访问方法.
但是,如果你出于某种原因需要整个响应作为字符串,那么流方法的所有效率对你都没有任何影响 - 因为即使你读了片段的响应,你仍然需要等待整个响应 - 并将它全部包含在一个字符串中 - 然后才能处理它.
如果您有一个用例,您可以在拥有整个响应主体之前开始处理响应,则只有您可以使用流的效率.
整个过程并没有提高内存效率。如果您从流中读取并将其放入字符串中,您只是将进程分成两部分,以便 HttpClient 类不会注意到它。
如果您确实需要整个字符串,那么您可以忽略该警告。然后,您需要确保每个请求不会使用太多内存,以便服务器不会轻易受到 DoS 攻击。
归档时间: |
|
查看次数: |
8220 次 |
最近记录: |