2012-10-18 2 views
6

Je suis en train de réaliser une PURGE avec HttpURLConnection comme ceci:Comment effectuer une purge HTTP à partir de 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(); 
     } 
    } 
} 

Mais je me: BOUCLÉ ​​

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

il n'y a pas de problème:

-I boucle - X PURGE -H "Hôte: 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 

Alors, comment puis-je faire est? Ai-je besoin de rouler depuis Java ou existe-t-il une autre bibliothèque que je peux utiliser?

Répondre

6

Vous pouvez utiliser la bibliothèque de HttpClient Apache: http://hc.apache.org/httpcomponents-client-ga/

Vous pouvez utiliser BasicHttpRequest ou implémenter votre propre classe HttpPurge extension HttpRequestBase.

Vous pouvez trouver un guide de démarrage rapide ici: http://hc.apache.org/httpcomponents-client-ga/quickstart.html

Exemple:

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

Merci! J'ai fini par étendre HttpMethodBase dans apache.commons.httpclient – jakob

+0

HttpMethodBase fait partie du projet Commons HttpClient, qui est en fait marqué comme "fin de vie". Voir plus ici http://hc.apache.org/httpclient-3.x/. Si vous voulez être à jour, vous devriez utiliser HttpComponents HttpClient: http://hc.apache.org/httpcomponents-client-ga/index.html – uldall

+0

Ok, je comprends! J'ai implémenté httpcomponents à la place. – jakob

4

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

L'appel:

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

Avec org.apache.commons.httpclient.HttpMethodBase désapprouvée:

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

L'appel:

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

Avec la HttpComponents L'API a changé. La version actuelle de la réponse d'uldall est comme:

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