2012-10-18 6 views
6

Sto cercando di eseguire una purga con HttpURLConnection come questo:Come faccio HTTP Purge da Java?

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(); 
     } 
    } 
} 

Ma sto ottenendo:

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

con l'arricciatura non c'è nessun problema:

ricciolo -I - X PURGE -H "Host: 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 

Così come faccio è? Devo arricciare da Java o c'è qualche altra libreria che posso usare?

risposta

6

È possibile utilizzare la biblioteca di HttpClient Apache: http://hc.apache.org/httpcomponents-client-ga/

È possibile utilizzare BasicHttpRequest o implementare la propria classe HttpPurge estende HttpRequestBase.

È possibile trovare una guida rapida qui: http://hc.apache.org/httpcomponents-client-ga/quickstart.html

Esempio:

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

Grazie! Ho finito per estendere HttpMethodBase in apache.commons.httpclient – jakob

+0

HttpMethodBase fa parte del progetto Commons HttpClient, che in realtà è contrassegnato come "end of life". Vedi di più qui http://hc.apache.org/httpclient-3.x/. se vuoi essere aggiornato dovresti usare HttpComponents HttpClient: http://hc.apache.org/httpcomponents-client-ga/index.html – uldall

+0

Ok capisco! Ho invece implementato i httpcomponents. – jakob

4

Con org.apache.httpcomponents 4.2.1:

classe:

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"; 
    } 
} 

La chiamata:

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(); 
     } 
} 

Con org.apache.commons.httpclient.HttpMethodBase Deprecated:

classe:

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"; 
    } 
} 

La chiamata:

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

Con HttpComponents la L'API è cambiata. La versione attuale della risposta di 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);