2015-10-27 2 views
0

Мой веб-сервер возвращает JSON в следующем виде в случае успеха (код 200 статус):дооснащения: Обработка ошибок JSON ответ

{"success":true,"data":{"user_id":"20","username":"Bob"}} 

Но если что-то пошло не так (например, если имя пользователя и пароль, введенный слишком Короче говоря, в форме), он возвращает JSON в следующем виде (400 код статуса):

{"success":true,"errors":{"username":["Username too short"],"password":["Incorrect password","Password too short"]}} 

Как обрабатывать эти два разных ответа в Retrofit? Это мой код до сих пор:

Как обрабатывать эти два по-разному структурированные ответы JSON?

+0

Так что я должен вернуть ответ об ошибке как код состояния '200'? Зачем? И как я могу найти разницу между успешным ответом и ответом на ошибку? – user5486944

+0

, если ответ равен 400, то это сбой и поэтому следует рассматривать как таковой ... Вы можете рассмотреть возможность реструктурирования своей модели, поэтому она обрабатывает объект «данных» и объект «ошибка». –

ответ

2

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

ваш сервер может вернуть флаг, указывающий успешность или неудачу входа в систему. После этого вы можете просто добавить модель ошибки в модель DefaultResponse. как так

public class DefaultResponse { 
     public boolean success; 
     public DataModel data; 
     public ErrorModel errors; 


    public static class DataModel { 
     private String user_id; 
     private String username; 
    } 

    public static class ErrorModel { ... } 
} 

Вы все еще будете нужно обрабатывать случаи, когда ваш сервер отвечает, кроме OK статусов, но обычно ответов об ошибках от сервера простого простым текст, как «плохой просьба» .. Можно, конечно, вставок json, если вы хотите извлечь из RetrofitError.getMessage(), но GSON не будет автоматически анализировать это для вас автоматически. Надеюсь, это поможет!

1

Вы должны понимать, что на самом деле оба отклика, которые вы опубликовали, являются успешными с точки зрения сетевого запроса. Состояние отказа для отказа запроса (ошибка сетевого подключения, 404 и т. Д.), А не отказ, который вы возвращаете после попытки входа пользователя в ваш сервер.

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

Вы также должны отказаться от отказа().

+0

Итак, если мой текущий класс модели выглядит так, как мне его изменить, чтобы обрабатывать ошибки? Http: // Pastebin.com/nkSScAS3 – user5486944

+0

рассмотреть возможность добавления статуса к вашему ответу, e, g ,: \t private int statusCode; Таким образом, сервер может указывать на погоду, когда вход в систему успешно завершен: 0 - Успех входа в систему 1 - неправильное имя пользователя/пароль 2 - неизвестная ошибка –

0

если вы получаете JSON от своего веб-сервиса, что означает его успех.

так, в методе успеха, возьмите JSON и обрабатывать его

, например, из вашего формата JSON

@Override 
     public void success(DefaultResponse json, Response response) { 
      try { 
      JSONObject json = new JSONObject(json); 
      JSONObject data = json.get("data"); // if no "data" element, it will throw JSONException 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      Toast.makeText(getApplicationContext(),"username to short",Toast.LENGTH_SHORT).show(); 
      } 
     } 

или вы можете использовать GSON для обработки данных в формате JSON

+0

retrofit использует GSON по умолчанию. это уже происходит –

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