Apache HttpComponents: org.apache.http.client.ClientProtocolException
Поэтому я использую Apache HttpComponents для обработки HTTP-запроса в Java. Теперь я хочу использовать DefaultHttpClient
Что должно быть возможно в соответствии с этим примером: http://wiki.apache.org/HttpComponents/QuickStart. Сам пример дает ошибку ssl, поэтому я немного ее смоделировал и упростил. Теперь я всегда получаю org.apache.http.client.ClientProtocolException
Вот мой пример программы, в основном я просто запрашиваю 2 веб-страницы, использующие один и тот же DefaultHttpClient
,
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class ClientFormLogin {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
//Handle first request.
HttpGet httpget = new HttpGet("http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html");
HttpResponse response = httpclient.execute(httpget);
System.out.println("Execute finished");
HttpEntity entity = response.getEntity();
String page = readInput(entity.getContent());
System.out.println("Request one finished without problems!");
//Handle second request
HttpGet httpost = new HttpGet("http://gathering.tweakers.net/forum/list_messages/1506977/last");
response = httpclient.execute(httpost);
entity = response.getEntity();
page = readInput(entity.getContent());
System.out.println("Request two finished without problems!");
}
private static String readInput(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte bytes[] = new byte[1024];
int n = in.read(bytes);
while (n != -1) {
out.write(bytes, 0, n);
n = in.read(bytes);
}
return new String(out.toString());
}
}
При запуске моего примера я получаю следующую ошибку
Request one finished without problems!
Exception in thread "main" org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
at ClientFormLogin.main(ClientFormLogin.java:29)
Caused by: org.apache.http.HttpException: Unable to establish route: planned = {}->http://gathering.tweakers.net; current = {}->http://tweakers.net
at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:842)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
... 3 more
Любой может дать мне несколько советов, как я могу решить эту проблему, кроме использования нового DefaultHttpClient
за каждый запрос.
редактировать
Я только что узнал, если я остаюсь в том же домене, у меня нет проблем, поэтому:
page1: 'http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html'
page2: 'http://tweakers.net/nieuws/82973/website-nujij-belandt-op-zwarte-lijst-google-door-malware.html'
У меня нет проблем, если я добрался до:
page1: 'http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html'
page2: 'http://gathering.tweakers.net/forum/list_messages/1506076/last'
Я получаю ошибку.
Ofc я вижу это через минуту после публикации моего вопроса. За исключением случаев, когда кто-то может сказать мне, как я могу перейти на 2 отдельных домена с тем же DefaultHttpClient
на мой вопрос уже дан ответ.
1 ответ
Вероятно, это связано с недавней ошибкой в версии 4.2 BasicClientConnectionManager, влияющей на перенаправления между сайтами. См. http://issues.apache.org/jira/browse/HTTPCLIENT-1193.
По словам сопровождающего, одним из временных обходных путей является использование SingleClientConnManager или PoolingClientConnectionManager. Возможно, что-то вроде этого:
ClientConnectionManager connManager = new PoolingClientConnectionManager();
DefaultHttpClient httpclient = new DefaultHttpClient(connManager);
...