Усечение Java HttpClient или PostMethod возвращает данные до 64 КБ - PullRequest
1 голос
/ 22 июня 2011

Я использую Apache Commons HttpClient для получения некоторых данных с сервера. Моя проблема в том, что возвращаемые данные XML всегда усекаются до первых 64 КБ. Я надеялся, что это может быть просто установка предела для соответствующего объекта, но, очевидно, нет - или, по крайней мере, я не могу найти никакой информации о таком методе. Я предполагаю, что это проблема клиента, поскольку сервер принадлежит другой компании и, по-видимому, хорошо передает данные всем остальным.

Есть идеи?

Кстати, мой код очень прост:

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
       return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }
}

Кстати, то же самое происходит со следующим кодом, использующим InputStreams, а не метод getResponseBodyAsString ().

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
        InputStream stream = post.getResponseBodyAsStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ( (line=reader.readLine()) != null ) {
            sb.append(line);
        }
        return sb.toString();
    } finally {
        post.releaseConnection();
    }
}

Итак, вы знаете, есть ли где-нибудь установленный предел? Тот факт, что String является ответом всегда 64k, кажется, предполагает, что должно быть. Но где?

Спасибо

Алистер

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

ERRATUM: предел в 64 КБ равен false. Это как артефакт отладчика eclipse, который не покажет, оказывается усекающим преступником.

РЕШЕНИЕ: теперь у меня есть код, работающий следующим образом:

PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    post.setRequestContentLength(PostMethod.CONTENT_LENGTH_AUTO);
    post.setStrictMode(true);
    try {
        client.executeMethod(post);
        return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }

Признаюсь, я не знаю , почему это работает, но порассуждать, что это как-то связано с настройками длины контента.

Отдельно знайте, что эти методы устарели, и я использую их только потому, что работаю над устаревшей системой. Если вы работаете над более адаптируемой системой, я бы посоветовал следовать совету @ HellGhost.

2 голосов
/ 23 июня 2011

Сохраните ResponseBody как строку и верните строку, потому что метод releaseConnection() вызывается перед возвратом результата.

Кроме того, вы должны подумать, действительно ли вы хотите использовать библиотеку HttpClient 3.x дажедалее, так как разработка была начата, и она была заменена библиотечным проектом HttpComponents в его модулях HttpClient и HttpCore.
Пример использования нового HttpClient:

HttpPost post = new HttpPost(server.getUrl());
HttpResponse response = client.executeMethod(post);
return EntityUtils.toString(response.getEntity());
...