简体   繁体   English

如何从Java进行HTTP清除?

[英]How do I do HTTP Purge from Java?

I'm trying to perform a PURGE with HttpUrlConnection like this: 我正在尝试使用HttpUrlConnection执行PURGE,如下所示:

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

But I'm getting: 但是我得到了:

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

With curl there is no problem: 卷曲没有问题:

curl -I -X PURGE -H "Host: www.somehost.com" someurl curl -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

So how do I do this? 那我该怎么做? Do I need to curl from Java or is there some other library that I can use? 我是否需要从Java卷曲或是否有其他我可以使用的库?

You can use Apache's HttpClient library: http://hc.apache.org/httpcomponents-client-ga/ 您可以使用Apache的HttpClient库: http//hc.apache.org/httpcomponents-client-ga/

You can either use BasicHttpRequest or implement your own HttpPurge class extending HttpRequestBase . 您可以使用BasicHttpRequest或实现自己的扩展HttpRequestBase的HttpPurge类。

You can find a quick-start guide here: http://hc.apache.org/httpcomponents-client-ga/quickstart.html 您可以在此处找到快速入门指南: http//hc.apache.org/httpcomponents-client-ga/quickstart.html

Example: 例:

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

With org.apache.httpcomponents 4.2.1: 使用org.apache.httpcomponents 4.2.1:

class: 类:

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

The call: 电话:

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

With deprecated org.apache.commons.httpclient.HttpMethodBase: 已弃用的org.apache.commons.httpclient.HttpMethodBase:

class: 类:

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

The call: 电话:

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

} }

With HttpComponents the API has changed. 使用HttpComponents,API已发生变化。 Current version of uldall's answer is like: 当前版本的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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM