2012-11-15 16 views
1

我試圖清除緩存squid,爲了做到這一點,我需要執行奇怪的http請求。適用於Java的靈活的低級別http庫?

請求應該是這樣的:

PURGE www.cached:port/params HTTP/1.1 

其中www.cached:port/params代表價值我想從緩存中刪除。

所以,這裏有趣的是 - 連接應該打開到魷魚服務器,而不是www.cached:port/params

因此,整個序列將是:

  1. 開放連接到服務器的魷魚。
  2. 通過PURGE請求。
  3. 閱讀結果。
  4. 接近

我試過的Apache的HttpClient。我可以重寫請求方法,使其發送PURGE,但是磁帶庫始終打開與它在http請求中傳遞的相同主機的連接(打開連接到www.cached,做一個PURGEwww.cached)並且它對我來說不起作用。

我可以通過使用純套接字來實現,但是找到一個可以正常工作的庫會很好。

+0

你有沒有看過https://netty.io/? – ollins

+0

它可以工作。我可以在DefaultHttpRequest上覆蓋toString。明天會試着去做。 – Alex

回答

0

首先,我沒有看到爲什麼Apache HttpClient無法做到這一點。您是否配置客戶端使用'http.route.default-proxy'參數通過代理執行請求?

無論如何,如果你不介意使用較低的成分,這是怎麼同樣可以使用Apache的HttpCore完成(阻塞)

HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] { 
      new RequestContent(), 
      new RequestTargetHost(), 
      new RequestConnControl(), 
      new RequestUserAgent()}); 

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); 

    HttpContext context = new BasicHttpContext(); 
    HttpHost target = new HttpHost("www.cached", port); 
    HttpHost proxy = new HttpHost("squid", 8080); 

    HttpParams params = new BasicHttpParams(); 
    HttpRequest request = new BasicHttpRequest("PURGE", "www.cached:port/params"); 

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); 
    try { 
     if (!conn.isOpen()) { 
      Socket socket = new Socket(proxy.getHostName(), proxy.getPort()); 
      conn.bind(socket, params); 
     } 
     context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); 
     context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, target); 

     httpexecutor.preProcess(request, httpproc, context); 
     HttpResponse response = httpexecutor.execute(request, conn, context); 
     httpexecutor.postProcess(response, httpproc, context); 

     // do something useful with the response 

     if (!connStrategy.keepAlive(response, context)) { 
      conn.close(); 
     } else { 
      // Connection could be kept alive 
     } 
    } finally { 
     conn.close(); 
    } 
} 

我相信同樣是非常可行的與其他HTTP庫

相關問題