如何使用java async http client(ning)库发布二进制字节

时间:2012-03-20 00:46:20

标签: java asynchronous httpclient

我需要使用Async Http Client(https://github.com/sonatype/async-http-client)将字节数组发布到URL.Content类型是octet-stream。

如何使用async http客户端执行此操作。 我应该使用ByteArrayBodyGenerator吗?是否有任何示例代码可以查看它是如何完成的?

如果字节数组已经在内存中,那么使用ByteArrayInputStream是否更好 并使用RequestBuilder.setBody(InputStream)

1 个答案:

答案 0 :(得分:2)

在文档中建议不要在setBody中使用InputStream,因为为了获取内容长度,库需要将所有内容加载到内存中。

似乎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();