2016-09-25 7 views
2

Я пытаюсь извлечь данные из этого api: http://www.omdbapi.com/ Я использую Retrofit 2 и создал pojo для первого json. Мне любопытно, как преобразовать мое pojo во второе, когда данные недоступны.Retrofit 2: Как обрабатывать динамический отклик

Когда есть доступные данные, возвращает этот 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/[email protected]_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!" 
} 

ответ

2

У вас есть несколько вариантов. Из моей головы простейшим является включение поля Error в исходное pojo и всегда проверяйте поле 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 return Http 404, когда данных нет. Затем вы можете проверить этот статус и использовать другое pojo для десериализации тела ошибки (pojo может быть просто сообщением об ошибке). Если вы используете модификацию со встроенным Callbacks, вам нужно будет сделать это на onResponse. Если вы используете RxJava, то это еще более прямолинейно, так как вы можете легко сделать это в методе onError (все ответы на отсутствие ответов на 2XX http в методе onError).

Вы можете получить доступ к корпусу ошибки модифицированного ответа с помощью errorBody. Вы можете преобразовать его в POJO с помощью Gson или просто используя этот фрагмент кода:

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

(Здесь MyError бы название POJO, содержащее поле ошибок).

Возможно, вы захотите создать фабрику преобразователя только один раз. Скорее всего, это должен быть тот, который вы использовали при создании экземпляра Retrofit.

Если вы на самом деле с помощью RxJava вы можете проверить мой ответ here о том, как получить доступ к телу ошибки в ответе Rx

+0

Большое спасибо за подробный ответ, Фред. =) Я пошел со вторым вариантом. Я создал модель состояния, которая содержит поля ответа и ошибки, а затем расширила мою первую модель с помощью состояния. –

+0

Рад, что я могу помочь – Fred

 Смежные вопросы

  • Нет связанных вопросов^_^