1. 程式人生 > >Using getResponseBodyAsStream instead is recommended

Using getResponseBodyAsStream instead is recommended

在用httpClient時,tomcat的控制檯報出以下警告。

2018-09-17 14:25:01,447  WARN (org.apache.commons.httpclient.HttpMethodBase:682) - Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

檢視程式碼,在用httpclient做請求時,用的是String respStr = method.getResponseBodyAsString()

檢視getResponseBodyAsString()原始碼

報WARN的條件是((contentLength == -1) || (contentLength> limit)),也就是說,或者是返回的HTTP頭沒有指定contentLength,或者是contentLength大於上限(預設是1M)。如果能確定返回結果的大小對程式沒有顯著影響,這個WARN就可以忽略,可以在日誌的配置中把HttpClient的日誌級別調到ERROR,不讓它報出來。

 

當然,這個警告也是有意義的,HttpClient建議使用InputStream getResponseBodyAsStream()代替byte[]getResponseBody()。對於返回結果很大或無法預知的情況,就需要使用InputStreamgetResponseBodyAsStream(),避免byte[] getResponseBody()可能帶來的記憶體的耗盡問題。 部署到tomcat之後,tomcat和redis多次掛掉。原因就是記憶體耗盡。

如果返回的頭資訊沒有指定長度或長度大於1M則丟擲如上異常。
則需把 getResponseBodyAsString()換成 getResponseBodyAsStream()即可

HttpClient client=new HttpClient();

GetMethod method=new GetMethod(URL);

PostMethod method = new PostMethod(URL);

client.executeMethod(method);

InputStream inputStream = method.getResponseBodyAsStream();  

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));  

StringBuffer stringBuffer = new StringBuffer();  

String str= "";  

while((str = br.readLine()) != null){  

    stringBuffer.append(str);  

 }

String  respStr = stringBuffer.toString();

這樣就可以對返回的字串respStr進行進一步解析了。