json을 Transfer-Encoding : chunked로 반환하는 서버에서 엔드 포인트를 스트리밍해야합니다.개조가 된 스트리밍 서버 2 - 청크
다음 코드가 있지만 응답을 읽을 수 없습니다. responseBody.streamBytes() 시도하고 입력 스트림을 문자열로 변환하지만 주 스레드에서 그것을 할 수 없습니다. 어떻게 응답을 읽을 수 있습니까?
@Streaming
@GET("stream/status")
Observable<ResponseBody> streamStatus();
Observable<ResponseBody> observable = ApiClientHelper.getClient().streamStatus();
observable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(final ResponseBody responseBody) {
//DON'T KNOW HOW TO READ DATA
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
편집 :
서버 응답 사용 CURL :
* Trying 192.168.1.3...
* TCP_NODELAY set
* Connected to 192.168.1.3 (192.168.1.3) port 80 (#0)
> GET /stream/meter HTTP/1.1
> Host: 192.168.1.3
> User-Agent: curl/7.54.0
> Accept: */*
> Cookie:sessionId=bf2533346190e1c72b532b9d6ec6a405
>
< HTTP/1.1 200 OK
< Content-Type: text/event-stream
< Cache-Control: no-cache, no-store
< Date: Tue, 17 Oct 2017 12:02:03 GMT
< Transfer-Encoding: chunked
< Connection: Keep-Alive
<
data: {"production":{"ph-a":{"p":-0.817,"q":0.0,"s":47.302,"v":225.697,"i":0.21,"pf":0.0,"f":50.0},"ph-b":{"p":-0.066,"q":-0.0,"s":0.643,"v":3.091,"i":0.206,"pf":0.0,"f":50.0},"ph-c":{"p":-0.195,"q":-0.0,"s":0.943,"v":7.577,"i":0.123,"pf":0.0,"f":50.0}},"net-consumption":{"ph-a":{"p":-0.598,"q":0.0,"s":51.931,"v":225.606,"i":0.231,"pf":0.0,"f":50.0},"ph-b":{"p":-0.088,"q":0.0,"s":0.875,"v":4.585,"i":0.19,"pf":0.0,"f":50.0},"ph-c":{"p":-0.043,"q":0.0,"s":0.16,"v":1.23,"i":0.13,"pf":-1.0,"f":50.0}},"total-consumption":{"ph-a":{"p":-1.415,"q":-0.0,"s":-4.599,"v":225.652,"i":-0.02,"pf":-1.0,"f":50.0},"ph-b":{"p":-0.154,"q":0.0,"s":0.06,"v":3.838,"i":0.016,"pf":-1.0,"f":50.0},"ph-c":{"p":-0.237,"q":0.0,"s":-0.033,"v":4.404,"i":-0.008,"pf":-1.0,"f":50.0}}}
이것은 http의 전문가는 아니지만 Retrfoit은 HTTP 클라이언트가 아니라고 생각합니다. 그래서 귀하의 응답으로 당신은 이미 개별 청크가 아니라 전체 다운로드 된 객체를 얻을 수 있습니다. 청크 처리는 아마도 OkHTTP 수준에서 일어날 것입니다. – Lukasz
모르겠다. 내 코드를 참조하십시오, 나는 onNext 메서드에서 responsebody 만 있습니다. – Yamila