2015-11-17 13 views
9

Próbuję przekonwertować następującą odpowiedź z Retrofit 2Modernizacja 2 - ciało zerowa reakcja

{ 
    "errorNumber":4, 
    "status":0, 
    "message":"G\u00f6nderilen de\u011ferler kontrol edilmeli", 
    "validate":[ 
     "Daha \u00f6nceden bu email ile kay\u0131t olunmu\u015f. L\u00fctfen giri\u015f yapmay\u0131 deneyiniz." 
    ] 
} 

Ale ja zawsze dobrze się null odpowiedź w onResponse metody. Tak więc próbowałem spojrzeć na treść błędu odpowiedzi z response.errorBody.string(). Treść błędu zawiera dokładnie tę samą treść z nieprzetworzoną odpowiedzią.

Oto moja metoda service, Retrofit obiektów i danych odpowiedzi declerations:

@FormUrlEncoded 
@POST("/Register") 
@Headers("Content-Type: application/x-www-form-urlencoded") 
Call<RegisterResponse> register(
     @Field("fullName") String fullName, 
     @Field("email")  String email, 
     @Field("password") String password); 

public class RegisterResponse { 
    public int status; 
    public String message; 
    public int errorNumber; 
    public List<String> validate; 
} 

OkHttpClient client = new OkHttpClient(); 
client.interceptors().add(new Interceptor() { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Response response = chain.proceed(chain.request()); 
     final String content = UtilityMethods.convertResponseToString(response); 
     Log.d(TAG, lastCalledMethodName + " - " + content); 
     return response.newBuilder().body(ResponseBody.create(response.body().contentType(), content)).build(); 
    } 
}); 
Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 
domainSearchWebServices = retrofit.create(DomainSearchWebServices.class); 

mam kontrolę odpowiedzi JSON z jsonschema2pojo aby zobaczyć, czy ja modled moją klasę reakcji Wright i wydaje się OK.

Dlaczego Retrofit nie może przekształcić mojej odpowiedzi?

UPDATE

Na razie jako dzieło wokół buduję moją odpowiedź organizmu błędu.

+0

Czy ustawiłeś konwerter Json? jak poniżej: 'RestAdapter restAdapter = new RestAdapter.Builder() .setConverter (nowy GsonConverter (gson))' – ProblemSlover

+0

@problemsolver yes Tak. Dodałem odpowiedni kod. –

+0

@problemsolver Użyłem 'addConverterFactory' not' setConverter' –

Odpowiedz

29

Rozwiązałem problem. Kiedy zgłoszę złe żądanie (HTTP 400), Retrofit nie konwertuje odpowiedzi. W takim przypadku możesz uzyskać dostęp do nieprzetworzonej odpowiedzi za pomocą response.errorBody.string(). Następnie możesz utworzyć nowego Gsona i przekształcić go ręcznie:

if (response.code() == 400) { 
    Log.d(TAG, "onResponse - Status : " + response.code()); 
    Gson gson = new Gson(); 
    TypeAdapter<RegisterResponse> adapter = gson.getAdapter(RegisterResponse.class); 
    try { 
     if (response.errorBody() != null) 
      registerResponse = 
       adapter.fromJson(
        response.errorBody().string()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

'errorBody' zawiesza się dla mnie. –

+0

@IgorGanapolsky powinieneś zawsze sprawdzić, czy treść lub treść błędu jest pusta. –

+0

Mam podobny problem, czy możesz doradzić? http://stackoverflow.com/questions/39261481/assigning-reference-when-accessing-json-response – tccpg288