2015-10-13 66 views
3

我如何連接並在讀取階連續(分塊)的HTTP流?舉例來說,如果我有Python編寫/瓶這一簡單的服務:斯卡拉連續讀取HTTP流

from gevent import monkey; monkey.patch_all() 

import gevent 
from bottle import route, run 

@route('/stream') 
def stream(): 
    while True: 
     yield 'blah\n' 
     gevent.sleep(1) 

run(host='0.0.0.0', port=8100, server='gevent') 

我打算使用akka-stream來處理數據,我只需要一種方法來檢索。

回答

3

這應該工作。基本上,你對一個產生分塊響應的uri執行單個請求。響應實體包含一個dataBytes流。在分塊響應的情況下,這將是塊的流。在一個非響應分塊(HttpEntity.Strict)的情況下,這將是隻有一個單一的塊流。

顯然你也可以在實體上顯式匹配來查看它是否是HttpEntity.Chunked,但通常你還想保留處理非分塊響應的能力。

在實際應用中,你不會用runForeach執行的副作用,但隨着數據字節流做一些處理。

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.model.{Uri, HttpRequest} 
import akka.stream.ActorMaterializer 

object ChunkTestClient extends App { 

    implicit val system = ActorSystem("test") 
    import system.dispatcher 

    implicit val materializer = ActorMaterializer() 
    val source = Uri("https://jigsaw.w3.org/HTTP/ChunkedScript") 
    val finished = Http().singleRequest(HttpRequest(uri = source)).flatMap { response => 
    response.entity.dataBytes.runForeach { chunk => 
     println(chunk.utf8String) 
    } 
    } 
}