2012-10-18 13 views
6

Ich versuche, ein PURGE mit HttpURLConnection wie folgt auszuführen:Wie mache ich HTTP-Bereinigung von 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(); 
     } 
    } 
} 

Aber ich bin immer:

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

Mit curl gibt es kein Problem:

curl -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 

Also wie mache ich th ist? Muss ich mich von Java locken lassen oder gibt es eine andere Bibliothek, die ich benutzen kann?

Antwort

6

können Sie Apache verwenden, die Httpclient-Bibliothek: http://hc.apache.org/httpcomponents-client-ga/

Sie entweder Ihre eigenen HttpPurge Klasse HttpRequestBase erstrecken können BasicHttpRequest oder implementieren.

Sie hier eine Kurzanleitung finden: http://hc.apache.org/httpcomponents-client-ga/quickstart.html

Beispiel:

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

Vielen Dank! Ich endete mit der Erweiterung von HttpMethodBase in apache.commons.httpclient – jakob

+0

HttpMethodBase ist Teil des Commons HttpClient-Projekts, das eigentlich als "Ende des Lebens" markiert ist. Sehen Sie mehr hier http://hc.apache.org/httpclient-3.x/. Wenn Sie auf dem neuesten Stand sein wollen, sollten Sie HttpComponents HttpClient verwenden: http://hc.apache.org/httpcomponents-client-ga/index.html – uldall

+0

Ok ich verstehe! Ich habe stattdessen httpcomponents implementiert. – jakob

4

Mit org.apache.httpcomponents 4.2.1:

Klasse:

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

Der Anruf:

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

Mit deprecated org.apache.commons.httpclient.HttpMethodBase:

Klasse:

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

Der Aufruf:

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

Mit der Httpcomponents API hat sich geändert. Aktuelle Version von Uldalls Antwort ist wie folgt:

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