2012-10-18 27 views
6

我试图用HttpURLConnection的这样进行吹扫:如何从Java进行HTTP清除?

private void callVarnish(URL url) { 
    HttpURLConnection conn = null; 

    try { 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setRequestMethod(PURGE_METHOD); 
     conn.setDoOutput(true); 
     conn.setInstanceFollowRedirects(true); 
     conn.setRequestProperty("Host", "www.somehost.com"); 
     conn.connect(); 
     System.out.print(conn.getResponseCode() + " " + conn.getResponseMessage()); 
    } 
    catch (Exception e) { 
     log.error("Could not call varnish: " + e); 
    } finally { 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 
} 

但我发现了:

08:56:31,813 ERROR [VarnishHandler] Could not call varnish: java.net.ProtocolException: Invalid HTTP method: PURGE 

,卷曲没有问题:

卷曲-I - X PURGE -H“主机:www.somehost.com”someurl

HTTP/1.1 404 Not in cache. 
Server: Varnish 
Content-Type: text/html; charset=utf-8 
Retry-After: 5 
Content-Length: 401 
Accept-Ranges: bytes 
Date: Thu, 18 Oct 2012 06:40:19 GMT 
X-Varnish: 1611365598 
Age: 0 
Via: 1.1 varnish 
Connection: close 
X-Cache: MISS 

那么我该怎么做是什么?我是否需要从Java中进行卷曲或者是否有其他一些可以使用的库?

回答

6

您可以使用Apache的HttpClient库:http://hc.apache.org/httpcomponents-client-ga/

您可以使用BasicHttpRequest或实现自己的HttpPurge类扩展HttpRequestBase

你可以找到一个快速入门指南这里:http://hc.apache.org/httpcomponents-client-ga/quickstart.html

例子:

DefaultHttpClient httpclient = new DefaultHttpClient(); 
BasicHttpRequest httpPurge = new BasicHttpRequest("PURGE", "www.somehost.com") 
HttpResponse response = httpclient.execute(httpPurge); 
+0

谢谢!我结束了扩展HttpMethodBase在apache.commons.httpclient – jakob

+0

HttpMethodBase是Commons HttpClient项目的一部分,它实际上标记为“生命的尽头”。在这里看到更多http://hc.apache.org/httpclient-3.x/。如果你想要更新你应该使用HttpComponents HttpClient:http://hc.apache.org/httpcomponents-client-ga/index.html – uldall

+0

好吧,我明白!我已经实现了httpcomponents。 – jakob

4

随着org.apache.httpcomponents 4.2.1:

类:

import org.apache.http.client.methods.HttpRequestBase; 

import java.net.URI; 

public class HttpPurge extends HttpRequestBase { 

    public final static String METHOD_NAME = "PURGE"; 

    public HttpPurge() { 
     super(); 
    } 

    @Override 
    public String getMethod() { 
     return METHOD_NAME; //To change body of implemented methods use File | Settings | File Templates. 
    } 

    public HttpPurge(final String uri) { 
     super(); 
     setURI(URI.create(uri)); 
    } 

    public String getName() { 
     return "PURGE"; 
    } 
} 
电话:
import org.apache.http.Header; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicHeader; 
import org.apache.http.util.EntityUtils; 
import test.HttpPurge 

private void callVarnish(URL url) { 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     HttpPurge httpPurge = new HttpPurge(url.toString()); 
     Header header = new BasicHeader("Host", "www.somewhere.se"); 
     httpPurge.setHeader(header); 
     try { 
      HttpResponse response = httpclient.execute(httpPurge); 
      System.out.print("-------------------------------------"); 
      System.out.println(response.getStatusLine()); 
      System.out.print("-------------------------------------"); 
      HttpEntity entity = response.getEntity(); 
      // If the response does not enclose an entity, there is no need 
      // to worry about connection release 
      if (entity != null) { 
       // do something useful with the response body 
       // and ensure it is fully consumed 
       EntityUtils.consume(entity); 
      } 
     } catch (IOException ex) { 

      // In case of an IOException the connection will be released 
      // back to the connection manager automatically 
     } catch (RuntimeException ex) { 

      // In case of an unexpected exception you may want to abort 
      // the HTTP request in order to shut down the underlying 
      // connection and release it back to the connection manager. 
      httpPurge.abort(); 
     } 
} 

已不适用org.apache.commons.httpclient.HttpMethodBase:

类:

import org.apache.commons.httpclient.HttpMethodBase; 

public class PurgeMethod extends HttpMethodBase { 

    public PurgeMethod() { 
     super(); 
     setFollowRedirects(true); 
    } 

    public PurgeMethod(String url) { 
     super(url); 
     setFollowRedirects(true); 
    } 

    public String getName() { 
     return "PURGE"; 
    } 
} 

召唤:

import org.apache.commons.httpclient.Header; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpMethod; 

private void callVarnish(URL url) { 
    HttpClient client = new HttpClient(); 
    HttpMethod method = new PurgeMethod(url.toString()); 

try { 
    int status = 0; 
    status = client.executeMethod(method); 

    log.debug(status); 
} catch (Exception e) { 
    // something 
} finally { 
    method.releaseConnection(); 
} 

}

2

随着HttpComponents的API已经改变。当前版本的uldall的回答如下:

HttpHost host = new HttpHost(hostname, port); 
HttpClient httpclient = HttpClientBuilder.create().build(); 
BasicHttpRequest purgeRequest = new BasicHttpRequest("PURGE", "/some/url"); 
HttpResponse response = httpclient.execute(host, purgeRequest);