【问题标题】:Retrofit 2: How to handle dynamic response改造 2:如何处理动态响应
【发布时间】:2016-09-25 15:01:04
【问题描述】:

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

当有数据可用时,返回这个json:

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

{
Title: "Suits",
Year: "2011–",
Rated: "TV-14",
Released: "23 Jun 2011",
Runtime: "44 min",
Genre: "Comedy, Drama",
Director: "N/A",
Writer: "Aaron Korsh",
Actors: "Gabriel Macht, Patrick J. Adams, Rick Hoffman, Meghan Markle",
Plot: "On the run from a drug deal gone bad, Mike Ross, a brilliant college-dropout, finds himself a job working with Harvey Specter, one of New York City's best lawyers.",
Language: "English",
Country: "USA",
Awards: "7 nominations.",
Poster: "http://ia.media-imdb.com/images/M/MV5BMTk1MjYzOTU2Nl5BMl5BanBnXkFtZTgwMzAxMTg5MTE@._V1_SX300.jpg",
Metascore: "N/A",
imdbRating: "8.7",
imdbVotes: "244,979",
imdbID: "tt1632701",
Type: "series",
totalSeasons: "6",
Response: "True"
}

当没有可用数据时,返回这个json:

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

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

【问题讨论】:

    标签: dynamic retrofit2 pojo


    【解决方案1】:

    您有几个选择。在我看来,最简单的方法是在原始 pojo 中包含 Error 字段,并始终检查字段 Response。当这是“真”时,所有其他字段都将出现。当“False”时,只有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 或简单地使用这个 sn-p 将其转换为 pojo:

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

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

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

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

    【讨论】:

    • 非常感谢 Fred 的详细回答。 =) 我选择了第二个选项。我创建了一个包含响应和错误字段的状态模型,然后用状态扩展了我的第一个模型。
    • 很高兴我能帮上忙
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2017-06-21
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多