好吧,我正试图找到一种方法让 http 组件遵循重定向,但在 google 上没有找到任何方法,所以我来这里寻求帮助 函数:
public String GetSite(String site, String path) throws Exception {
HttpParams params = new SyncBasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[]{
// Required protocol interceptors
new RequestContent(),
new RequestTargetHost(),
// Recommended protocol interceptors
new RequestConnControl(),
new RequestUserAgent(),
new RequestExpectContinue()});
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpContext context = new BasicHttpContext(null);
HttpHost host = new HttpHost(site, 80);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
try {
String[] targets = {
path};
for (int i = 0; i < targets.length; i++) {
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
response.setParams(params);
httpexecutor.postProcess(response, httpproc, context);
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
}
return (EntityUtils.toString(response.getEntity()));
}
} finally {
conn.close();
}
return null;
}
这方面也有帮助吗?因为我找不到任何东西...
最佳答案
我建议您使用基本的 DefaultHttpClient
,它支持重定向,无需任何调整或附加代码。它的行为可以通过 section 5.2 HttpClient parameters 中描述的 4 个参数来控制。 .
如果您真的不想依赖httpcomponents-client
,而只想依赖httpcomponents-core
,您将不得不选择implementation from org.apache.http.impl.client.RedirectStrategy
。并创建您自己的代码来解析响应,确定它是否是有效的重定向(仔细阅读 HTTP 规范,这不是那么简单)并在需要时触发循环中的新请求。
我的意见:没有理由再写这么复杂的代码,总有一天会需要身份验证,你也必须添加这种支持。所以,就靠HttpClient吧。
关于java - HTTP 组件核心跟随重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935359/