2012-03-20 67 views
3

我需要使用異步Http客戶端(https://github.com/sonatype/async-http-client)將一個字節數組發佈到URL.Content類型是八位字節流。如何使用java異步http客戶端(ning)庫POST POST二進制字節

如何使用異步http客戶端進行操作。 我應該使用ByteArrayBodyGenerator嗎?有沒有任何示例代碼來看看它是如何完成的?

如果字節數組已經在內存,是它更好地使用ByteArrayInputStream的 和使用RequestBuilder.setBody(InputStream的)

回答

2

建議在文檔不使用的InputStream在setBody,因爲爲了獲取內容長度,庫需要加載內存中的所有內容。

而且似乎ByteArrayBodyGenerator有同樣的問題。要獲得內容長度,它使用bytes.length()bytes的呼叫是您的字節數組(private final byte [] 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();