Android 通过改装2+接收Gzip JSON响应;rxjava2
根据Jesse Wilson的说法,我试图以Gzip json的形式接收一些数据,OkHttp自动解压缩,我不需要做任何事情 所以我的问题是,我可以像这样接收gzip Json吗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
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);
}
});