改造2:如何处理动态响应

时间:2016-09-25 15:01:05

标签: dynamic retrofit2 pojo

我正在尝试从此API获取数据:http://www.omdbapi.com/ 我正在使用Retrofit 2并为第一个json创建了一个pojo。我很好奇的是当数据不可用时如何将我的pojo转换为第二个。

当有可用数据时,它返回此json:

http://www.omdbapi.com/?t=Suits

{
Response: "False",
Error: "Movie not found!"
}

当没有数据可用时,它返回此json:

http://www.omdbapi.com/?t=asdasdas

         while (Input.hasNext()){
             String in  = Input.next();
             for(int i=0;i< in.length();i++) {
                 if(Character.toLowerCase(in.charAt(i)) == 'f')
                     System.out.print(f+",");
                 else if(Character.toLowerCase(in.charAt(i))=='e')
                     System.out.print(e+",");
             }
             System.out.println("");
         }

1 个答案:

答案 0 :(得分:3)

你有几个选择。在我的脑海中,最简单的一个是在原始的pojo中包含Error字段,并始终检查字段Response。当这是&#34; True&#34;比所有其他领域都要存在。当&#34; False&#34;时,只有Error字段。

另一种选择,也许最不灵活和可理解的是从你可以继承的地方获得一个pojo Error。您仍然需要检查Response的值以检查是否存在错误。我个人会在这里避免这个选项,但我认为你仍然可以做到这一点很好。像这样:

class Error {
  @SerializedName("Error")
  @Expose
  private String error;
  // ...
}

class Movie extends Error {
  // other fields here
}

正如你所看到的那样,这很难看,但有效......

您可以尝试的第三个选项是检查Http状态代码。这个取决于API。如果api返回Http代码200,即使出现错误,那么这不是那么直接。然而,它是我最喜欢的,因为它提供了更多正确性。

假设api在没有数据的情况下返回Http 404。然后,您可以检查此状态并使用不同的pojo来反序列化错误正文(pojo可能只是错误消息)。如果您使用内置Callbacks进行改造,则必须在onResponse上执行此操作。如果您正在使用RxJava,那么这更加直接,因为您可以在onError方法中轻松完成(所有非2XX http响应都在onError方法中着陆)。

您可以使用errorBody访问改装响应的错误正文。您可以使用Gson或仅使用此代码段将其转换为pojo:

Converter<ResponseBody, MyError> converter = new GsonConverterFactory()
   .responseBodyConverter(MyError.class, Annotation[0]);
MyError error = converter.convert(response.errorBody());

(这里MyError将是包含错误字段的pojo的名称。)

您可能只想创建转换器工厂一次。最有可能应该是您在创建Retrofit实例时使用的那个。

如果您实际使用RxJava,可以查看我的答案here,了解如何在Rx响应中访问错误正文