ClientProtocolException в httpClient.execute(httpget, responseHandler)

Я использую следующий код для запроса xml с веб-сервера:

HttpClient httpclient = new DefaultHttpClient()
try 
{
    HttpGet httpget = new HttpGet("http://63.255.173.242/get_public_tbl.cgi?A=1");              
    ResponseHandler responseHandler = new BasicResponseHandler();
    String responseBody = httpclient.execute(httpget, responseHandler);
    System.out.println(responseBody);
}
catch (ClientProtocolException e)
{
    e.printStackTrace();
}
catch (IOException e)
{
    e.printStackTrace();
} 
finally 
{
    httpclient.getConnectionManager().shutdown();
}

Я получаю исключение clientProtocolException, когда вызываю httpclient.execute(httpget, responseHandler). URL-адрес отлично работает в веб-браузере, он возвращает xml, и браузер отображает его.

Любые идеи, почему я должен получить clientProtocolException, и все же браузер отлично справляется с этим?

Редактировать 1:

Глядя на исключение протокола, подробное сообщение: «Серверу не удалось ответить действительным ответом HTTP». Я не могу изменить веб-сервер, на который я нажимаю. Есть ли способ игнорировать это и просто получить доступ к ответу?

Редактировать 2:

Я обнаружил, что сервер не отправляет полный заголовок. Есть ли способ получить доступ к содержимому ответа, даже если возвращается неработающий заголовок?

Редактировать 3: я отредактировал IP-адрес, чтобы он был реальным IP-адресом, который я нажимаю. Любая помощь приветствуется.


person Kevin Westwood    schedule 02.10.2012    source источник
comment
какое было решение. у меня такая же проблема   -  person Sumeet Rathore    schedule 28.05.2015


Ответы (6)


Поскольку ваш код кажется правильным, вам нужно выяснить: это ошибка клиента (неверный запрос) или ошибка сервера (неверный ответ). Для этого используйте https://stackoverflow.com/questions/12944862/http-trace-utitlity/12967817#12967817 и сравните запросы браузера с этим вашего клиента. Вы также сможете увидеть необработанный ответ сервера, если таковой имеется. Если вы не можете понять это, добавьте необработанный запрос и ответ на свой вопрос, и кто-то может помочь.

person Evgeniy Berezovsky    schedule 30.10.2012
comment
Я знаю, что сервер не отправляет правильный ответ, поскольку заголовки не завершены. Но сервер не может измениться. Это сторонний сервер, для которого я реализую функциональность. Несмотря на это, я знаю, что должен быть способ получить доступ к необработанному ответу и отсортировать данные, которые мне нужны. То, что я разместил, является моей просьбой. Есть ли способ лучше? - person Kevin Westwood; 03.11.2012
comment
Я обнаружил, что сервер вообще не отправляет заголовок. Лучшим решением было напрямую общаться с сокетами. - person Kevin Westwood; 05.11.2012
comment
@ Кевин, что ты наконец сделал с этой проблемой, у меня такая же проблема? - person Sumeet Rathore; 28.05.2015

Я проверил ваш код с моим IP-адресом. В коде нет ошибки. Я только что изменил ResponseHandler на BasicResponseHandler.

Проверь это

 HttpClient httpclient = new DefaultHttpClient();
    try 
    {
        HttpGet httpget = new HttpGet("http://www.MyServer.com/get_public_tbl.cgi?A=1");               
        BasicResponseHandler responseHandler = new BasicResponseHandler();//Here is the change
        String responseBody = httpclient.execute(httpget, responseHandler);
        System.out.println(responseBody);
    }
    catch (ClientProtocolException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    } 
    finally 
    {
        httpclient.getConnectionManager().shutdown();
    }
person Ram kiran    schedule 02.10.2012
comment
Это хорошее улучшение моего кода, но не решает проблему. - person Kevin Westwood; 04.10.2012

Вы можете попробовать добавить свой собственный перехватчик ответов, где вы можете добавлять или удалять заголовки или печатать некоторую отладочную информацию.

hc.addResponseInterceptor(new HttpResponseInterceptor() {
    @Override
    public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
        response.getEntity().writeTo(System.out);
    }
});
person lanwen    schedule 09.10.2012
comment
Я добавил перехватчик ответа, но метод процесса не вызывается до того, как будет выдано исключение протокола. Если я сталкиваюсь с сервером, который отправляет действительный заголовок, вызывается метод процесса. Любые другие идеи? - person Kevin Westwood; 16.10.2012
comment
Вы можете добавить new HttpRequestInterceptor с методом void process(HttpRequest request, HttpContext context) таким же образом, затем распечатать и сравнить заголовки запроса, который идет из браузера и из вашего кода. Может быть сервер w8 Accept-Encoding, заголовок gzip или что-то еще - person lanwen; 21.12.2012

Проверьте свои заголовки, которые вы установили в клиенте, повторно проверьте как ключ, так и значение заголовков. В моем случае я использовал параметр «csrf» вместо «Cookie».

person Rahul Jain    schedule 04.02.2017

Я столкнулся с похожей проблемой, ClientProtocolException
По-видимому, на сервере не было целевого веб-сервиса SSL
, поэтому это была неправильная конфигурация SSL,

Основная ошибка:

  java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

После добавления хранилища доверенных сертификатов в java эта ошибка исчезла.

надеюсь, это поможет кому-то.

person JavaSheriff    schedule 05.03.2019

В моем случае я удалил приведенную ниже зависимость из файла pom, и это устранило проблему:

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.9</version>
    </dependency>
person Madhu Stv    schedule 28.08.2019