У меня есть строгий 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], в зависимости от правильности пароля.
Я не могу изменить процедуры, это означает, что я не могу изменить свой ответ и добавить общее поле к ошибке и успеху.