当前位置: 首页 > 知识库问答 >
问题:

我们如何用改型2处理不同的响应类型?

杜禄
2023-03-14
[
  { //JSON MyPOJO },
  { //JSON MyPOJO }
]
{  
  'error': 'foo', 
  'message':'bar' 
}
Call<List<MyPOJO>> request = ...
request.enqueue(new Callback<List<MyPOJO>>() {
  @Override
  public void onResponse(Response<List<MyPOJO>> response) {
      if (response.isSuccess()) {
          List<MyPOJO> myList = response.body();
          // do something with the list...
      } else {
          // server responded with an error, here is how we are supposed to retrieve it
          ErrorResponse error = ErrorResponse.fromResponseBody(apiService.getRetrofitInstance(), response.errorBody());
          processError(error);
          // but we never get there because GSON deserialization throws an error !
      }
  }

  @Override
  public void onFailure(Throwable t) {
    if(t instanceof IOException){
        // network error 
    }else if(t instanceof IllegalStateException){
        // on server sending an error object we get there
        // how can I retrieve the error object ?
    }else { 
        // default error handling 
    }       
  }
}

以下是GSON的例外:

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

改型实例是使用GsonConverterFactory创建的

共有1个答案

彭飞虎
2023-03-14

我有一个类似的问题,我通过使用一个通用的对象来解决它,然后使用instanceof测试响应类型

Call<Object> call = api.login(username, password);
call.enqueue(new Callback<Object>() 
{
    @Override
    public void onResponse(Response<Object> response, Retrofit retrofit)
    {
         if (response.body() instanceof MyPOJO )
         {
            MyPOJO myObj = (MyPOJO) response.body();
            //handle MyPOJO 
         }
         else  //must be error object
         {
            MyError myError = (MyError) response.body();
            //handle error object
         }
    }

    @Override
    public void onFailure(Throwable t) 
    {
     ///Handle failure
    }
});

在我的例子中,我返回了MyPOJO或MyError,我可以肯定它将是其中之一。

在其他情况下,无论请求是否成功,我都让后端返回相同的响应对象。
然后在这个响应对象中的“Object”字段中有我的实际数据。然后,我可以使用实例来确定我拥有的数据类型。在这种情况下,无论调用是什么,我总是返回相同的对象。

public class MyResponse {

    private int responseCode;
    private String command;
    private int errorno;
    private String errorMessage;
    private Object responseObject;   //This object varies depending on what command was called
    private Date responseTime;
}
 类似资料:
  • 最近我开始使用reverfit2,我遇到了一个解析空响应体的问题。我有一个服务器,它只响应http代码,没有任何内容在响应体。 我如何只处理关于服务器响应的元信息(报头、状态代码等)?

  • 我知道这个问题已经被问了很多,但我所看到的答案都没有帮助我澄清这个问题。我需要更多的指导方针,而不是一个具体的答案。 错误,没有这样的用户 到目前为止,我所尝试的是为列表中收到的每个对象创建一个类: 和Api,我认为这就是问题所在: 提前感谢!!

  • 当没有数据avilable时,它返回以下JSON: http://www.omdbapi.com/?t=asdasdas

  • null 我的问题是如何为这种情况定义POJO类。 我试图用创建两个同名字段,但是抱怨POJO有重复的字段。

  • 我使用的是最新版本的改造,改造2,v2.0.0-beta3。API响应是User对象或空响应(空值)。如果我发送正确的用户名/密码,那么句柄将进入带有成功用户对象的响应方法。但是如果发送错误的密码,那么API将不返回任何内容,响应头中的值很少。但是我在onFailure(可抛出)中得到了MalformedJsonExc0019。 “com.google.gson.stream.MalformedJ

  • 我使用的是改型2.0.1。我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,服务器找不到等)我已经找到这个链接。但是其中一些方法在V1.8.0中被否决了。在2.0.1中如何做到这一点?