java - Java 的灵活低级 http 库?

标签 java http apache-httpclient-4.x squid purge

我试图清除 squid 上的缓存为了做到这一点,我需要执行奇怪的 http 请求。

请求应如下所示:

PURGE www.cached:port/params HTTP/1.1

其中 www.cached:port/params 表示我要从缓存中删除的值。

因此,有趣的是 - 应打开到鱿鱼服务器的连接,而不是 www.cached:port/params

所以,整个序列将是:

  1. 打开与鱿鱼服务器的连接。
  2. 传递PURGE请求。
  3. 读取结果。
  4. 关闭

我尝试了apache httpclient。我可以重写请求方法以使其发送 PURGE,但库始终打开针对它在 http 请求中传递的同一主机的连接(打开与 www.cached 的连接,执行 PURGE www.cached),但它对我不起作用。

我可以使用纯套接字来做到这一点,但找到一个可以正常工作的库会很棒。

最佳答案

首先,我认为没有理由不能使用 Apache HttpClient 来完成此操作。您是否将客户端配置为使用“http.route.default-proxy”参数通过代理执行请求?

无论如何,如果您不介意使用较低的组件,这就是如何使用 Apache HttpCore(阻塞)来完成同样的事情

    HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[] {
            new RequestContent(),
            new RequestTargetHost(),
            new RequestConnControl(),
            new RequestUserAgent()});

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();

    HttpContext context = new BasicHttpContext();
    HttpHost target = new HttpHost("www.cached", port);
    HttpHost proxy = new HttpHost("squid", 8080);

    HttpParams params = new BasicHttpParams();
    HttpRequest request = new BasicHttpRequest("PURGE", "www.cached:port/params");

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
    try {
        if (!conn.isOpen()) {
            Socket socket = new Socket(proxy.getHostName(), proxy.getPort());
            conn.bind(socket, params);
        }
        context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
        context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, target);

        httpexecutor.preProcess(request, httpproc, context);
        HttpResponse response = httpexecutor.execute(request, conn, context);
        httpexecutor.postProcess(response, httpproc, context);

        // do something useful with the response

        if (!connStrategy.keepAlive(response, context)) {
            conn.close();
        } else {
            // Connection could be kept alive
        }
    } finally {
        conn.close();
    }
}

我确信其他 HTTP 库也可以做到这一点

关于java - Java 的灵活低级 http 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13393173/

相关文章:

php - 重定向页面不起作用,除非我先刷新它

java - Apache HttpClient 制作多部分表单帖子

android - AsynTask 中的文件类型错误

java - 使用 Mockito 验证无参数和私有(private)方法

json - 执行此操作需要 SSL

c# - 使用 HttpClient,在 301 的情况下如何防止自动重定向并获取原始状态代码和转发 Url

java - 在检索重定向 url 之前使用 Apache HttpHead 进行 URI 编码

java - 如何最小化长 && 语句 - Java

java - 仅在 iframe 中设置应用程序状态

java - 面向对象的执行