我试图清除 squid 上的缓存为了做到这一点,我需要执行奇怪的 http 请求。
请求应如下所示:
PURGE www.cached:port/params HTTP/1.1
其中 www.cached:port/params
表示我要从缓存中删除的值。
因此,有趣的是 - 应打开到鱿鱼服务器的连接,而不是 www.cached:port/params
。
所以,整个序列将是:
- 打开与鱿鱼服务器的连接。
- 传递
PURGE
请求。 - 读取结果。
- 关闭
我尝试了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/