Android 通过改装2+接收Gzip JSON响应;rxjava2

Android 通过改装2+接收Gzip JSON响应;rxjava2,android,json,gzip,retrofit2,rx-java2,Android,Json,Gzip,Retrofit2,Rx Java2,根据Jesse Wilson的说法,我试图以Gzip json的形式接收一些数据,OkHttp自动解压缩,我不需要做任何事情 所以我的问题是,我可以像这样接收gzip Json吗 apiService.getMessages().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSu

根据Jesse Wilson的说法,我试图以Gzip json的形式接收一些数据,OkHttp自动解压缩,我不需要做任何事情

所以我的问题是,我可以像这样接收gzip Json吗

apiService.getMessages().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableSubscriber<MessagesGet>() {
                    @Override
                    public void onNext(MessagesGet messagesGet) {



                        Timber.d("GET MESSAGES DATA READY TO HANDLE");

                    }

                    @Override
                    public void onError(Throwable t) {

                        Timber.e("ERROR GETTING MESSAGES");

                    }

                    @Override
                    public void onComplete() {

                        Timber.e("GETMESSAGES COMPLETED");

                    }
                });
apiService.getMessages().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribowith(新的可处置认购人(){
@凌驾
public void onNext(MessagesGet MessagesGet){
Timber.d(“准备好处理信息数据”);
}
@凌驾
公共作废登记员(可丢弃的t){
Timber.e(“错误获取消息”);
}
@凌驾
未完成的公共空间(){
Timber.e(“完成信息”);
}
});

@标题({
“内容类型:application/json;charset=utf-8”,
“接受:应用程序/json”
})
@获取(“获取消息”)
可流动的getMessages();

如前所述。

服务接口。在哪里声明API

@Headers(“内容类型:应用程序/x-gzip”)
@GET(api.GET\u路径)
单个下载gzip(@Path(value=“Path”,encoded=true)字符串路径);
改型+RxJava配置

public的createService(类serviceClass){
OkHttpClient.Builder mHttpClient=新的OkHttpClient.Builder();
mHttpClient.connectTimeout(60,时间单位为秒);
mHttpClient.readTimeout(60,时间单位为秒);
HttpLoggingInterceptor logging=新的HttpLoggingInterceptor();
if(BuildConfig.DEBUG){
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
}否则{
logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
}
mHttpClient.addInterceptor(日志记录);
返回新的改装.Builder()
.baseUrl(baseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(mHttpClient.build())
.build()
.创建(serviceClass);
}
触发GZIP下载

ApiService-ApiService=serviceGenerator.createServiceForm(ApiService.class);
apiService.downloadGzip(apidentpoint)//apidentpoint是GZIP的直接下载URL
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新的SingleObserver(){
@凌驾
订阅时的公共作废(一次性){
i(LOGGER,“gzip下载->”+“订阅”);
}
@凌驾
成功时的公共无效(响应-响应-响应-响应){
//responseBodyResponse包含gzip
i(LOGGER,“gzip下载->”+“成功”);
//阅读gzip
ByteArrayInputStream bais=null;
试一试{
bais=newbytearrayinputstream(responseBodyResponse.body().bytes());
gzip输入流gzis=新的gzip输入流(BAI);
InputStreamReader=新的InputStreamReader(gzis);
BufferedReader in=新的BufferedReader(读卡器);
读取字符串;
StringBuilder gzipResponseString=新建StringBuilder();
而((readed=in.readLine())!=null){
追加(已读);//在StringBuilder中写入gzip数据
}
i(记录器,“Gzip字符串->”+Gzip响应字符串);
}捕获(IOE异常){
e(记录器,“gzip提取异常->”+e.getLocalizedMessage(),e);
}
}
@凌驾
公共作废登记员(可丢弃){
e(记录器,“gzip失败->”+throwable.getMessage(),throwable);
}
});

您可以根据需要继续使用DisposableSubscriber。

gzip包含什么类型的数据?@Aks4125 STRING您尝试过吗?。应该行的。你找到合适的解决办法了吗?我也在努力做到这一点。@IgorGanapolsky记不太清楚了,但我得到的回应是压缩的,而不是用解压方法解压的嗨,谢谢你的回答,但这一个不能解释发生了什么,那么,您在这里所做的是通过改造和rxjava获得Gzip json文件,并对每个字符串进行完全解压或逐个解压?什么是getJsonByFormUrl()方法?我如何知道我正在以表单url编码的形式获取数据?我应该在哪里处理解压缩json的新请求?我有很多问题
@Headers({
            "Content-Type: application/json;charset=utf-8",
            "Accept: application/json"
    })
    @GET("getmessages")
    Flowable<MessagesGet> getMessages();
@Headers("Content-Type: application/x-gzip")
@GET(Apis.GET_PATH)
Single<Response<ResponseBody>> downloadGzip(@Path(value = "path", encoded = true) String path);
public <S> S createService(Class<S> serviceClass) {


    OkHttpClient.Builder mHttpClient = new OkHttpClient.Builder();
    mHttpClient.connectTimeout(60, TimeUnit.SECONDS);
    mHttpClient.readTimeout(60, TimeUnit.SECONDS);
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();

    if (BuildConfig.DEBUG) {
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    } else {
        logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
    }

    mHttpClient.addInterceptor(logging);

    return new Retrofit.Builder()
            .baseUrl(baseURL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(mHttpClient.build())
            .build()
            .create(serviceClass);

}
ApiService apiService = serviceGenerator.createServiceForm(ApiService.class);

apiService.downloadGzip(apiEndPoint) // apiEndPoint is direct download URL of GZIP
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new SingleObserver<Response<ResponseBody>>() {
                @Override
                public void onSubscribe(Disposable disposable) {
                    AppLogger.i(LOGGER, "gzip download ->" + "subscribed");
                }

                @Override
                public void onSuccess(Response<ResponseBody> responseBodyResponse) {
                //responseBodyResponse contains gzip
                    AppLogger.i(LOGGER, "gzip download -> " + " success");


                    // read gzip 
                    ByteArrayInputStream bais = null;
                    try {
                        bais = new ByteArrayInputStream(responseBodyResponse.body().bytes());

                        GZIPInputStream gzis = new GZIPInputStream(bais);
                        InputStreamReader reader = new InputStreamReader(gzis);
                        BufferedReader in = new BufferedReader(reader);

                        String readed;
                        StringBuilder gzipResponseString = new StringBuilder();
                        while ((readed = in.readLine()) != null) {
                            gzipResponseString.append(readed); //write gzip data in StringBuilder
                        }

                        AppLogger.i(LOGGER, "Gzip string->" + gzipResponseString);


                    } catch (IOException e) {
                        AppLogger.e(LOGGER, "gzip extract exception->" + e.getLocalizedMessage(), e);
                    }
                }

                @Override
                public void onError(Throwable throwable) {
                    AppLogger.e(LOGGER, "gzip failed->" + throwable.getMessage(), throwable);
                }
            });