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進行進一步解析了。