Мне нужен объект HttpResponse (или аналогичный), который я могу читать во время моей собственной программы, не беспокоясь о таймаутах сервера - PullRequest
0 голосов
/ 11 ноября 2010

Это первое http-программирование, которое я сделал, и я самоучка, так что это может быть глупым вопросом ...

edit: В конечном итоге мой вопрос сводится к следующему: каков хороший способ получить доступ ко всему содержимому HttpResponse (т.е. заголовкам + сущности), но в мое приятное время? Т.е. скачать, а затем позволить клиентскому процессу.

Я создал метод, который помещает HTTP-запрос GET на сервер. Это все работает нормально, и я использую функцию HttpClient.execute () , чтобы отослать ее, и она возвращает объект HttpResponse с моим содержимым XML в теле сущности. Меня беспокоит то, что в официальном учебнике по Apache подчеркивается важность «потребления» содержимого объекта ответа, чтобы освободить соединение, используемое для передачи ответа. Почему бы не быть бесплатным? Означает ли это, что после execute вернул HttpResponse, но до того, как я с ним что-то сделал, клиент фактически не получил тело сущности, и только когда я явно обращаюсь к входному потоку, исходящему от него, мой клиент фактически получает тело, на какой-то связи, которая ждала меня, чтобы спросить?

Я использовал объекты BufferedHttpEntity для немедленной буферизации объекта ответа, чтобы убедиться, что у моего клиента нет проблем с тайм-аутом, и он не обрабатывает ответ достаточно быстро, но я не уверен, нужно ли это. Когда я должен использовать BufferedHttpEntity?

1 Ответ

1 голос
/ 11 ноября 2010

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

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

Возможно, вы не потребляете все содержимого при получении XML.Возможно, персонаж остался на стороне сервера.Вызывая consumeContent(), вы освобождаете этот последний байт.

В этом примере используется весь контент (чтение потока до его окончания):

public class HttpTest {
    public static void main(String... args) throws Exception {

        System.out.println(readTextPage(new URL("http://stackoverflow.com")));
    }

    private static String readTextPage(URL url) throws Exception {

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url.toURI());
        HttpResponse response = client.execute(request);


        Reader reader = null;
        try {
            reader = new InputStreamReader(response.getEntity().getContent());

            StringBuffer sb = new StringBuffer();
            {
                int read;
                char[] cbuf = new char[1024];
                while ((read = reader.read(cbuf)) != -1)
                    sb.append(cbuf, 0, read);
            }

            return sb.toString();

        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...