2014-03-01 6 views
12

json 데이터의 http 스트리밍을 수행하는 끝점에 연결하려고합니다. Go의 net/http 패키지를 사용하여 기본 요청을 수행하고 들어오는대로 응답을 읽는 방법을 궁금합니다. 현재 연결이 닫힐 때만 응답을 읽을 수 있습니다.Golang의 net/http 패키지를 사용하여 스트리밍 응답 본문을 읽으려면 어떻게해야합니까?

resp, err := http.Get("localhost:8080/stream") 
if err != nil { 
    ... 
} 
... 
// perform work while connected and getting data 

어떤 통찰력이라도 대단히 감사하겠습니다!

감사합니다.

-RC

+0

당신이 [이 답변] 봤어 (http://stackoverflow.com/questions/19292113/not-buffered-http-responsewritter-in- : 모든 유형의 데이터를 읽는 경우, 아래의 방법을 사용할 수 있습니다 golang) 도움이 되나요? –

+0

해당 코드는 스트림에서 작동합니다. 예상 할 때 얻지 못한다면 서버가 보내는 방법 때문입니다. 나는이 모델로 많은 기가 바이트의 응답을 분석했다. – Dustin

답변

10

스트리밍 JSON 구문 분석을 수행하는 방법은 디코더 함께 :

json.NewDecoder(resp.Body).Decode(&yourStuff) 

는 (라 트위터) 돌아 오는 객체의 무리의 스트리밍 API를 들어, 그 스트림한다 이 모델과 내장 된 인코딩/json API를 사용하면 매우 좋습니다. 그러나 10MB의 거대한 배열을 가진 객체를 가지고있는 큰 응답 인 경우에는 내부 조각을 꺼내 반환하는 데 자체 디코더를 작성해야 할 것입니다. 제가 작성한 도서관에서 그 문제에 부딪 혔습니다.

+0

답변 해 주셔서 감사합니다! bufio.Reader를 만들고 resp.Body에서 ReadBytes()를 호출하여 작업을 수행 할 수있었습니다. – chourobin

+0

Eve, 최대 10MB에 대한 문서는 어디에 있습니까? 나는 정보가 필요하다. – KingRider

+0

그것은 최대가 아니며, 파서가 작동하는 방식이다. –

23

Wes Freeman이 제공 한 대답은 json 데이터를 읽는 올바른 방법입니다.

resp, err := http.Get("http://localhost:3000/stream") 
... 

reader := bufio.NewReader(resp.Body) 
for { 
    line, err := reader.ReadBytes('\n') 
    ... 

    log.Println(string(line)) 
} 
+0

그런데 [] 바이트에서 EOF를 어떻게 감지하나요? – jsgoecke

+2

오류가있는 EOF가 반환됩니다. – ciscogambo