Ошибка ответа от вызова API с использованием Retrofit2 - PullRequest
0 голосов
/ 02 октября 2018

Я хочу позвонить в API, и ответ об ошибке происходит двумя способами.

Первый такой: (где сообщение - это объект с несколькими списками строк)

{
  "success": false,
  "message": {
    "email": [
        "Must be between 2 and 20 characters."
    ],
    "password": [
        "Must be between 2 and 25 characters."
    ]
  }
}

А другой похож на это (где сообщение - просто строка)

{
  "success": false,
  "message": "User with that email exists."
}

Моя модель до сих пор выглядит так:

public class ErrorResponse {

    @Expose
    @SerializedName("success")
    private boolean success;


    @Expose
    @SerializedName("message")
    private Message message;

    //constructor & getters & setters

    public class Message {

        @Expose
        @SerializedName("email")
        private List<String> email;

        @Expose
        @SerializedName("password")
        private List<String> password;

        //constructor & getters & setters
    }
}

Как я могу рассматривать оба случая "сообщение "в модельном классе?

Ответы [ 5 ]

0 голосов
/ 02 октября 2018

Попробуйте, это работает для меня.и это самый простой способ обработать ответ такого типа.

Запрос API с использованием ResponseBody,

Call<ResponseBody> call = .......

        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                try {
                    if (response.body() != null && response.body().string() != null) {

                        Object json = new JSONTokener(response.toString()).nextValue();

                        if (json instanceof JSONArray) {
                            MyResponse1 myResponse = new Gson().fromJson(response.body().string(), MyResponse1.class);
                            myResponse.getMessage().getEmail();
                        } else if (json instanceof JSONObject) {

                            MyResponse2 myResponse = new Gson().fromJson(response.body().string(), MyResponse2.class);
                            myResponse.getMessage();
                        }

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                // Handle exception here
            }
        });

Взять два класса объектов для двух разных ответов:

// MyResponse1.java

public class MyResponse1 {


    private boolean success;
    private MessageBean message;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public MessageBean getMessage() {
        return message;
    }

    public void setMessage(MessageBean message) {
        this.message = message;
    }

    public static class MessageBean {
        private List<String> email;
        private List<String> password;

        public List<String> getEmail() {
            return email;
        }

        public void setEmail(List<String> email) {
            this.email = email;
        }

        public List<String> getPassword() {
            return password;
        }

        public void setPassword(List<String> password) {
            this.password = password;
        }
    }
}

// MyResponse2.java

public class MyResponse2 {


    private boolean success;
    private String message;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
0 голосов
/ 02 октября 2018

Вы можете попробовать что-то вроде этого,

       JSONObject json = new JSONObject(response);
        if (json.has("message")) {
            if (json.get("message") instanceof String) {
                message = json.getString("message");
            } else if (json.get("message") instanceof JSONObject) {
                JSONObject jsonObject = json.getJSONObject("message");
                if (jsonObject.has("email")) {
                    JSONArray array = jsonObject.getJSONArray("email");
                    for (int i = 0; i < array.length(); i++) {
                        email.add(array.getString(i));
                    }
                }
                if (jsonObject.has("password")) {
                    JSONArray array = jsonObject.getJSONArray("password");
                    for (int i = 0; i < array.length(); i++) {
                        password.add(array.getString(i));
                    }
                }
            }
        }

Не забудьте обработать JSONException.

0 голосов
/ 02 октября 2018

Если эти два шаблона исправлены, вы можете попробовать следующим образом:

ErrorResponse.java

public class ErrorResponse {

@Expose
@SerializedName("success")
private boolean success;


@Expose
@SerializedName("message")
private MyMessage message;

public class MyMessage{

 private Message message;

 private String StrMessage;

}

//constructor & getters & setters

public class Message {

    @Expose
    @SerializedName("email")
    private List<String> email;

    @Expose
    @SerializedName("password")
    private List<String> password;

    //constructor & getters & setters
}
}

А когда вы хотите использовать их значение, просто проверьтекакое значение это как ниже.

if(StrMessage!=null){
//Message is string.
}
else{
//do your stuff. 
}
0 голосов
/ 02 октября 2018

Вы должны проанализировать ваш JSON вручную, например, если у вашего JSON есть message, а у вашего message есть тег электронной почты, то используется вторая модель, и если не используется первая модель, он работает, только если у вас есть эти два видасообщения.

как-то так, используя Gson:

JsonElement rootTree = parser.parse(jsonRequest);
        if (rootTree.isJsonObject()) {

         JsonObject object = rootTree.getAsJsonObject();
         JsonElement message= object.get("message");

         if(message.isJsonObject()) {
                JsonElement email = message.get("email");

                if(email != null) {
                          //Use second model
                } else {
                          //Use first model                     
                }
         }
}
0 голосов
/ 02 октября 2018

Простой способ - иметь свойство ErrorMessage и success пометить флаг представления в клиенте.

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