zhou-you / RxEasyHttp

本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载进度显示,请求错误自动重试,请求携带token、时间戳、签名sign动态配置,自动登录成功后请求重发功能,3种层次的参数设置默认全局局部,默认标准ApiResult同时可以支持自定义的数据结构,已经能满足现在的大部分网络请求。
Apache License 2.0
3.13k stars 615 forks source link

data会为null的,还是得谨慎选择吧,好像没有什么合理的解决方法,要自己再解析 #188

Closed HaleyHong closed 4 years ago

zhou-you commented 5 years ago

data会为null确实比较麻烦,Rxjava2 onNext 不能返回null是非常麻烦的一个问题

strivecheng commented 5 years ago

@HaleyHong 让后台改啊,data没有数据不要给null啊

HaleyHong commented 5 years ago

@HaleyHong 让后台改啊,data没有数据不要给null啊

这只是一个问题之一吧,后台才是大佬啊,而且returnCode大多不止两个状态,比如身份过期等,有时请求成功时也需要使用msg提示。最后还是通过String,然后再封一层自己解析。

strivecheng commented 5 years ago

@HaleyHong 让后台改啊,data没有数据不要给null啊

这只是一个问题之一吧,后台才是大佬啊,而且returnCode大多不止两个状态,比如身份过期等,有时请求成功时也需要使用msg提示。最后还是通过String,然后再封一层自己解析。

直接怼后台啊,说他们不规范。身份过期这种应该属于错误请求了吧,直接show msg就行了吧。后台不符合标准Restful,要么让他们按标准来,要么就全部自己解析。

HaleyHong commented 5 years ago

@HaleyHong 让后台改啊,data没有数据不要给null啊

这只是一个问题之一吧,后台才是大佬啊,而且returnCode大多不止两个状态,比如身份过期等,有时请求成功时也需要使用msg提示。最后还是通过String,然后再封一层自己解析。

直接怼后台啊,说他们不规范。身份过期这种应该属于错误请求了吧,直接show msg就行了吧。后台不符合标准Restful,要么让他们按标准来,要么就全部自己解析。

挺符合Restful按标准的,只是提出一些问题,比如:成功时需要show msg就糗了,不同错误也有不同的操作。主要还是自己全解析,别挖坑

932707629 commented 5 years ago

data为null我是这样解决的 给getData返回值加一个判空 是null就返回一个new Object();

TakeNotes2019 commented 5 years ago

用基本类型 解析 空 好像就不行

qwerttest commented 4 years ago

重写了解析方法: @Override public ApiResult apply(@NonNull ResponseBody responseBody) throws Exception { ApiResult apiResult = new ApiResult<>(); apiResult.setCode(-1); if (type instanceof ParameterizedType) {//自定义ApiResult final Class cls = (Class) ((ParameterizedType) type).getRawType(); if (ApiResult.class.isAssignableFrom(cls)) { final Type[] params = ((ParameterizedType) type).getActualTypeArguments(); final Class clazz = Utils.getClass(params[0], 0); final Class rawType = Utils.getClass(type, 0); try { String json = responseBody.string(); //增加是List判断错误的问题 if (!List.class.isAssignableFrom(rawType) && clazz.equals(String.class)) { apiResult.setData((T) json); apiResult.setCode(ApiResult.code_ok); / final Type type = Utils.getType(cls, 0); ApiResult result = gson.fromJson(json, type); if (result != null) { apiResult = result; apiResult.setData((T) json); } else { apiResult.setMsg("json is null"); }/ } else { try { JsonObject jsonObject = gson.fromJson(json, JsonObject.class); JSONObject jsonObject1 = new JSONObject(json); JsonElement element = jsonObject.get("data"); if(element.isJsonNull()){ if(List.class.isAssignableFrom(rawType)){ jsonObject1.put("data", new JSONArray()); } else{ jsonObject1.put("data", new JSONObject()); } } else if(element.isJsonPrimitive()){ JSONObject data = new JSONObject(); data.put("data", element.getAsString()); jsonObject1.put("data", data); } ApiResult result = gson.fromJson(jsonObject1.toString(), type); if (result != null) { apiResult = result; } else { apiResult.setMsg("json is null"); } } catch (JsonSyntaxException e) { e.printStackTrace(); JSONObject jsonObject = new JSONObject(json); int code = jsonObject.getInt("code"); String message = jsonObject.getString("message"); apiResult.setCode(code); apiResult.setMsg(message); } } } catch (Exception e) { e.printStackTrace(); apiResult.setMsg(e.getMessage()); } finally { responseBody.close(); } } else { apiResult.setMsg("ApiResult.class.isAssignableFrom(cls) err!!"); } } else {//默认Apiresult try { final String json = responseBody.string(); final Class clazz = Utils.getClass(type, 0); if (clazz.equals(String.class)) { //apiResult.setData((T) json); //apiResult.setCode(0); final ApiResult result = parseApiResult(json, apiResult); if (result != null) { apiResult = result; apiResult.setData((T) json); } else { apiResult.setMsg("json is null"); } } else { final ApiResult result = parseApiResult(json, apiResult); if (result != null) { apiResult = result; if (apiResult.getData() != null) { T data = gson.fromJson(apiResult.getData().toString(), clazz); apiResult.setData(data); } else { apiResult.setMsg("ApiResult's data is null"); } } else { apiResult.setMsg("json is null"); } } } catch (JSONException e) { e.printStackTrace(); apiResult.setMsg(e.getMessage()); } catch (IOException e) { e.printStackTrace(); apiResult.setMsg(e.getMessage()); } finally { responseBody.close(); } } return apiResult; }