簡體   English   中英

如何限制HttpClient響應長度

[英]How to limit HttpClient response length

我使用htmlunithttpclient 如何將httpclientresponse body length限制為1MB

訣竅很簡單。 您必須接受InputStream,從中讀取並在超出限制時停止讀取。

      InputStream instream = method.getResponseBodyAsStream();

我做了一個調整apache示例的示例。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class HttpClientTutorial {

  private static String url = "http://www.apache.com";
  private static final int LIMIT = 1024*1024;//set to 1MB
  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();
    // Create a method instance.
    GetMethod method = new GetMethod(url);   
    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
            new DefaultHttpMethodRetryHandler(3, false));
    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);
      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }
      // Read the response body.
      //byte[] responseBody = method.getResponseBody();
      byte[] responseBody = null;    
      InputStream instream = method.getResponseBodyAsStream();
      if (instream != null) {
          long contentLength = method.getResponseContentLength();
          if (contentLength < Integer.MAX_VALUE) { //guard below cast from overflow
              ByteArrayOutputStream outstream = new ByteArrayOutputStream();
              byte[] buffer = new byte[1024];
              int len;
              int total = 0;
              while ((len = instream.read(buffer)) > 0 && total<LIMIT) {
                  outstream.write(buffer, 0, len);
                  total+= len;
              }
              responseBody = outstream.toByteArray();
              outstream.close();
              instream.close();
              System.out.println(new String(responseBody));
          }
      }
    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    }  
  }
}

我希望這有幫助。

您可以使用Apache Commons的BoundedInputStream 這是一個只提供一定長度字節的流 - 如果它的位置高於該值,它將停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM