2016-01-08 3 views
1

Я использую последнюю версию retrofit2, v2.0.0-beta3. Ответ API - это либо объект пользователя, либо пустой ответ (нулевое значение). Если я отправлю правильное имя пользователя/пароль, тогда дескриптор переходит в метод onResponse с успешным объектом User. Но если вы отправляете неправильный пароль, тогда API ничего не вернет, с небольшими значениями в заголовках ответов. Но я получаю MalformedJsonException в onFailure (Throwable).как обработать ответ с помощью retrofit2 (v2.0.0-beta3)

"com.google.gson.stream.MalformedJsonException: Используйте JsonReader.setLenient (истина), чтобы принять искаженной JSON в строке 1 колонки 1 путь $"

здесь скриншот ошибки, enter image description here

Я думаю, что должно быть каким-то образом обработать нулевой ответ и прочитать заголовки ответов, используя ResponseInceptor или Custom CallBack. Но не знаю, как я могу это использовать.

здесь код,

// Define the interceptor, add authentication headers 
Interceptor interceptor = new Interceptor() { 
    @Override 
    public okhttp3.Response intercept(Chain chain) throws IOException { 
     Request newRequest = chain.request().newBuilder().addHeader("Authorization", new ITAuthorizationUtil().getAuthorization(user.getMobile_no(), user.getPassword())).build(); 
     return chain.proceed(newRequest); 
    } 
}; 

// Add the interceptor to OkHttpClient 
OkHttpClient client = new OkHttpClient.Builder() 
     .addInterceptor(interceptor) 
     .build(); 

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(baseURL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .client(client) 
     .build(); 

ITAPIEndpointsInterface apiEndpointsInterface = retrofit.create(ITAPIEndpointsInterface.class); 


/// 
Call<User> call = apiEndpointsInterface.userLogin(senderId, applicationId, registrationId); 

//asynchronous call 
call.enqueue(new Callback<User>() { 
    @Override 
    public void onResponse(Response<User> response) { 
      ApiResponse apiResponse = ITAPIStatusInfo.getApiErrorObject_Retrofit(response.headers()); 
      onSuccess(response.body(),apiResponse); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
      Log.d(">>> ",t.getMessage()); 
    } 

}); 

ответ

1

Вы должны предоставить экземпляр GSON дооснащения.

Try:

Gson gson = new GsonBuilder().create(); 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(baseURL) 
    .addConverterFactory(GsonConverterFactory.create(gson)) 
    .client(client) 
    .build(); 
0

Вы добавили «com.squareup.retrofit2: конвертер-gson: зависимостей Gradle 2.0.0-beta3'to?

Чем вы можете просто создать экземпляр Модернизированный вроде этого:

private static MyClient MyClient; 
public static String baseUrl = "http://mybaseurl.com" ; 

public static MyClient getClient() { 
    if (MyClient == null) { 

     OkHttpClient httpClient = new OkHttpClient(); 

     Retrofit client = new Retrofit.Builder() 
       .baseUrl(baseUrl) 
       .client(httpClient) 
       .addConverterFactory(GsonConverterFactory.create()) 
       //.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .build(); 
     MyClient = client.create(MyClient.class); 
    } 
    return MyClient; 
} 

И для заголовков, другой способ добавления, как это «Authorization» заголовок, который вы добавляете, то просто добавьте в ваших API конечных точек интерфейс аннотацию под названием @Header для вызовов API, который заголовок необходимо

Пример:

@POST("/login/") 
    Call<Farm> login(@Header("Authorization") String token, @Body User user);