Как создать динамический анализатор ответов JSON для retrofit2? - PullRequest
0 голосов
/ 23 января 2019

У меня есть строгий API, который даст мне другой JSON в зависимости от того, правильный запрос или нет. Я могу иметь 2 разных JSON для одного и того же запроса. Статус запроса ВСЕГДА будет 200 (если это ошибка или успех), поэтому я не могу использовать статус запроса

Error response : 
{
    "stError": {
        "azType": "Application",
        "azCode": "Bad value parameter - azPassword is empty"
    }
}

Success response : 
{
     "azToken": "qsdsqd",   #1 And this field can be inexistant if the bLogin is 0
     "bLogin" : 1
}

Итак, я создал POJO , который мне был нужен:

public class LoginAPIResponse {

    @SerializedName("azToken")
    @Expose
    private String azToken;
    @SerializedName("bLogin")
    @Expose
    private Boolean bLogin;

    ### Setters and getters stuff ###
}

public class LOLError {

    @SerializedName("stError")
    @Expose
    private stError stError;

    ### Setters and getters stuff ###
}

public class stError {

    @SerializedName("azType")
    @Expose
    private String azType;
    @SerializedName("azCode")
    @Expose
    private String azCode;

    ### Setters and getters stuff ###
}

И, конечно, у меня есть мой сервис, который мне нужен, когда я создаю свой веб-сервис

public interface LoginService {

    /***
     * @POST declares an HTTP POST Request
     * This request is use when a user needs to login with his credentials
     */
    @POST("JCExecDev/JCOSSUserLogin")
    Call<LOLError> login(@Body LoginAPIRequest request);
}

А вот моя функция входа в мой репозиторий:

Call</*[DynamicResponse?]*/> call = loginService.login(request);

call.enqueue(new Callback</*[DynamicResponse?]*/>() {
    @Override
    public void onResponse(Call</*[DynamicResponse?]*/> call, Response<LOLError> response) {

    call.enqueue(new Callback</*[DynamicResponse?]*/>() {
        @Override
        public void onResponse(Call</*[DynamicResponse?]*/> call, Response<LOLError> response) {
           // Manage to find the way to get either LOLError or LoginAPIResponse
        }

        @Override
        public void onFailure(Call</*[DynamicResponse?]*/> call, Throwable t) {
        #Failure from the server, we do not take this in consideration
}
});

Я использую модификацию 2 с десериализацией GSON.

А вот и мои вопросы:

  • Могу ли я динамически загрузить правильный ответ, используя только модификацию (или найти способ получить его в DynamicResponse, как я его указал в примере)?
  • Если нет, то лучше ли управлять им с помощью специального десериализатора?
  • Если я использую собственный десериализатор, можно ли его использовать, чтобы он всегда мог вернуть мне ошибку, если есть какие-то ошибки (может быть, с шаблонами?)
  • Есть ли простой способ сделать это, получив необработанные данные в моем ответе и затем десериализовав их вручную?
  • Наконец, как я могу управлять тем фактом, что некоторые поля из моего ответа могут быть несуществующими, как токен, когда учетные данные неверны. Например, для успешного ответа я могу либо avec [bLogin: 0], либо [azToken: «myToken», bLogin: 1], в зависимости от правильности пароля.

Я не могу изменить процедуры, это означает, что я не могу изменить свой ответ и добавить общее поле к ошибке и успеху.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...