2012-03-20 8 views
3

バイト配列をURL.Contentに送信するにはAsync Http Client(https://github.com/sonatype/async-http-client)を使用する必要がありますタイプはオクテットストリームです。java async httpクライアント(ning)ライブラリを使用してバイナリバイトをPOSTする方法

どのように非同期httpクライアントを使用して行いますか。 ByteArrayBodyGeneratorを使用する必要がありますか?それがどのように行われるかを見るためのコード例はありますか?

バイト配列は、メモリ内にすでに存在する場合、それはするByteArrayInputStream を使用してRequestBuilder.setBody(InputStreamを)使用することをお勧めし

答えて

2

ために順番にそれは、setBodyにInputStreamを使用しないようにするために、ドキュメントで提案されましたコンテンツの長さを取得すると、ライブラリはすべてをメモリにロードする必要があります。

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実装を書き込むことができます。

final SimpleAsyncHttpClient client = new SimpleAsyncHttpClient.Builder() 
       .setRequestTimeoutInMs(Integer.MAX_VALUE) 
       .setUrl(url) 
       .build(); 

client.post(new ByteArrayBodyGenerator(YOUR_BYTE_ARRAY)).get(); 

をそして、あなたは、従来のAPIを使用する場合:

はまた、あなたはBodyGeneratorの使用例を求め

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