В документации рекомендуется не использовать InputStream в setBody
, потому что для получения длины содержимого библиотека должна будет загрузить все в память.
И, похоже, ByteArrayBodyGenerator имеетта же проблема.Чтобы получить длину содержимого, он использует вызов bytes.length()
, а bytes
- ваш байтовый массив (закрытый байтовый байт [] байтов;).Итак, чтобы получить длину байтового массива, массив должен быть загружен в память.
Вот источник из github: https://github.com/sonatype/async-http-client/blob/master/src/main/java/com/ning/http/client/generators/ByteArrayBodyGenerator.java
Вы можете написать свою собственную реализацию BodyGenerator визбежать этой проблемы.
Также вы попросили привести пример использования BodyGenerator:
final SimpleAsyncHttpClient client = new SimpleAsyncHttpClient.Builder()
.setRequestTimeoutInMs(Integer.MAX_VALUE)
.setUrl(url)
.build();
client.post(new ByteArrayBodyGenerator(YOUR_BYTE_ARRAY)).get();
А если вы хотите использовать устаревший API:
final AsyncHttpClientConfig config
= new AsyncHttpClientConfig.Builder().setRequestTimeoutInMs(Integer.MAX_VALUE).build();
final AsyncHttpClient client = new AsyncHttpClient(config);
client.preparePost(url)
.setBody(new ByteArrayBodyGenerator(YOUR_BYTE_ARRAY))
.execute()
.get();