2016-05-11 3 views
-3

Я использую Retrofit 2.0.2, и я не могу получить тело ошибки json и преобразовать его. Вот мой код:Retrofit 2.0.2 get error string body

public RestClient() { 
    retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    apiInterface = retrofit.create(ApiInterface.class); 
} 

     @FormUrlEncoded 
    @POST("users/login") 
    Call<Person> login(@FieldMap Map<String, String> map); 

    private void login(Map<String, String> map) { 
    Call<Person> call = restClient.getApiInterface().login(map); 

    Log.d("Login_call", call.request().toString()); 

    call.enqueue(new Callback<Person>() { 
     @Override 
     public void onResponse(Call<Person> call, Response<Person> response) { 
      Log.d("Login_call", response.isSuccessful() + " " + response.message()); 
      if (response.isSuccessful()) { 
       Log.d("Login_call", response.body().toString()); 
       //editor.putString("user", new Gson().toJson(response.body())); 
       //editor.apply(); 
      } 
      else { 
       Log.d("Login_call", response.errorBody().toString()); 
      } 
     } 

     @Override 
     public void onFailure(Call<Person> call, Throwable t) { 
      Log.d("Login_call_fail", "Fail"); 
     } 
    }); 
} 

и здесь мои журналы:

05-11 17: 54: 09,961 2606-2606/D/Login_call: ложный Bad Request

05-11 17 : 54: 09,961 2606-2606/D/Login_call: [email protected]

Как решить это?

+0

использовать хороший URL, чтобы не получить 400 - Неверный запрос –

+0

опубликовать полную реализацию с получить лучшую помощь –

ответ

6

Я нашел ответ на свой вопрос here Возможно, это поможет кому-то. .

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

public class ApiError { 

@SerializedName("status") 
private String status; 

@SerializedName("message") 
private String message; 

public String getStatus() { 
    return status; 
} 

public String getMessage() { 
    return message; 
} 

@Override 
public String toString() { 
    return "ApiError{" + 
      "status='" + status + '\'' + 
      ", message='" + message + '\'' + 
      '}'; 
} 

}

Второй шаг создать класс, который преобразует JSON в Ошибка модели Вот моя реализация:

public class ErrorUtils { 

public static ApiError parseError(RestClient client, Response<?> response) { 

    Converter<ResponseBody, ApiError> converter = client.getRetrofit() 
      .responseBodyConverter(ApiError.class, new Annotation[0]); 

    ApiError error; 

    try { 
     error = converter.convert(response.errorBody()); 
    } catch (IOException e) { 
     return new ApiError(); 
    } 

    return error; 
} 

}

и как я его использую:

private void login(Map<String, String> map) { 
    Call<Person> call = restClient.getApiInterface().login(map); 

    Log.d("Login_call", call.request().toString()); 

    call.enqueue(new Callback<Person>() { 
     @Override 
     public void onResponse(Call<Person> call, Response<Person> response) { 
      Log.d("Login_call", response.isSuccessful() + " " + response.message()); 
      if (response.isSuccessful()) { 
       Log.d("Login_call", response.body().toString()); 
       //editor.putString("user", new Gson().toJson(response.body())); 
       //editor.apply(); 
      } 
      else { 
       Log.d("Login_call", response.code() + ""); 
       ApiError error = ErrorUtils.parseError(restClient, response); 
       Log.d("Login_call_error", error.toString() + ""); 
      } 
     } 

     @Override 
     public void onFailure(Call<Person> call, Throwable t) { 
      Log.d("Login_call_fail", "Fail"); 
     } 
    }); 
} 

Спасибо!

1
String data=response.errorBody().string(); 
    try { 
      JSONObject jObjError = new JSONObject(data); 
     Toast.makeText(getContext(),jObjError.getString("message"), 
     Toast.LENGTH_LONG).show(); 
     } 
    catch (Exception e) { 
     Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 

     } 

Счастливого кодирование ..

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