2016-10-20 2 views
0

[Java DSL] Ich versuche, einen Stream von Bytes auf einen Server (als der Körper) mit der Client-API in Echtzeit zu buchen, aber nicht die Länge vor kennen der Beginn der Anfrage.Client-POST von unbestimmter Länge zu einem Server

Ich kann nicht herausfinden, wie dies aus der akka-http-Dokumentation zu tun, hat jemand dies versucht?

Antwort

0

Da Sie ein materializer aus dem Akka Kontext erstellt haben, und haben ein Source die ByteString Objekte mysource genannt erzeugt:

Http httpContext = 
    Http.get(context().system()); 

Source<ByteString, NotUsed> chunked = 
    mysource.map(str -> ByteString(str.concat("\n"))) 
     .concat(Source.single(ByteString.empty())); 

HttpRequest post = HttpRequest.POST("http://some-server/address") 
    .withEntity(HttpEntities.createChunked(ContentTypes.APPLICATION_OCTET_STREAM, chunked)) 
    .withProtocol(HttpProtoclas.HTTP_1_1); 

CompletionStage<HttpResponse> result = 
    httpContext.singleRequest(post, materializer); 

Beachten Sie, dass wir ein leeres ByteString Quellobjekt auf den ursprünglichen Source um verketten zu signalisieren Sie das Ende des Chunked Stream.

Wenn Sie dies innerhalb eines Schauspielers ausgeben, verwenden Sie am besten eine pipe(), um die endgültige Anfrage zu senden.

Verwandte Themen