栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Retrofit2处理状态码为200但json结构与datamodel类不同时的条件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Retrofit2处理状态码为200但json结构与datamodel类不同时的条件

因此,您从同一端点有两个不同的成功响应(状态码200)。一个是实际的数据模型,另一个是错误(都像这样的json结构?:

有效的LoginBean响应:

{  "id": 1234,  "something": "something"}

错误回应

{  "error": "error message"}

您可以做的是拥有一个包装两种情况并使用自定义反序列化器的实体。

class LoginBeanResponse {  @Nullable private final LoginBean loginBean;  @Nullable private final ErrorMessage errorMessage;  LoginBeanResponse(@Nullable LoginBean loginBean, @Nullable ErrorMessage errorMessage) {    this.loginBean = loginBean;    this.errorMessage = errorMessage;  }  // Add getters and whatever you need}

错误的包装器:

class ErrorMessage {  String errorMessage;  // And whatever else you need  // ...}

然后,您需要一个

JsonDeserializer

public class LoginBeanResponseDeserializer implements JsonDeserializer<LoginBeanResponse> {  @Override  public LoginBeanResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {    // based on the structure you check if the data is valid or not    // Example for the above defined structures:    // Get JsonObject    final JsonObject jsonObject = json.getAsJsonObject();    if (jsonObject.has("error") {      ErrorMessage errorMessage = new Gson().fromJson(jsonObject, ErrorMessage.class);      return new LoginBeanResponse(null, errorMessage)    } else {      LoginBean loginBean = new Gson().fromJson(jsonObject, LoginBean.class):      return new LoginBeanResponse(loginBean, null);    }  }}

然后将此反序列化器添加到中

GsonConverterFactory

GsonBuilder gsonBuilder = new GsonBuilder().registerTypeAdapter(LoginBeanResponse.class, new LoginBeanResponseDeserializer()).create():apiClient = new Retrofit.Builder()    .baseUrl(url)    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())    .addConverterFactory(GsonConverterFactory.create(gsonBuilder))    .client(httpClient)    .build();

这是我可以想到的唯一方法。但是,正如已经提到的,这种API设计是错误的,因为存在状态代码是有原因的。我仍然希望这会有所帮助。

编辑:然后,您可以在调用Retrofit的类中做什么(如果您已经使用RxJava
从转换

Call<LoginBeanResponse>
Single<LoginBeanResponse>
)实际上返回了正确的错误。就像是:

Single<LoginBean> getLoginResponse(Map<String, String> queryMap) {    restApi.getLoginResponse(queryMap)        .map(loginBeanResponse -> { if(loginBeanResponse.isError()) { Single.error(new Throwable(loginBeanResponse.getError().getErrorMessage()))        } else {  Single.just(loginBeanReponse.getLoginBean())         }})}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号