2016-09-29 3 views
0

Поскольку мне нужно использовать Retrofit 2, и мне нужно зарегистрироваться, что происходит за запросом, поэтому решение добавляет запрос-перехватчик. Я добавил перехватчик, который я беру из okhttp wiki page. Я также добавляю некоторые другие изменения в качестве своих потребностей и устанавливаю их на okhttp-клиент на этапе сборки, но он не работает так, как я ожидал. для моего удивления, когда я устанавливаю свой пользовательский Interceptor для okhttp-клиента, GsonConverter не может разобрать ответ json на java-объекты.Добавить заголовки в перехватчик при переоборудовании 2

Вот код из моего перехватчик

public class LoggingInterceptor implements Interceptor { 

private final static String TAG = "RI"; 

private HashMap<String, String> headersMap = null; 
public LoggingInterceptor(HashMap<String, String> headers) { 
    this.headersMap = headers; 
} 

@Override 
public Response intercept(Chain chain) throws IOException { 

    Request request = chain.request(); 
    Request.Builder reqBuilder = request.newBuilder(); 
    Log.e(TAG, "Headers on the map -> " + headersMap.size()); 
    for (String header : headersMap.keySet()) { 
     reqBuilder.addHeader(header, headersMap.get(header)); 
    } 

    request = reqBuilder.build(); 
    long timeRequest = System.nanoTime(); 
    Log.d(TAG, String.format(Locale.getDefault(), "Sending %s with %s", request.url(), request.headers())); 

    Response response = chain.proceed(request); 

    Log.d(TAG, "<<<=========================================>>>"); 
    long timeResponse = System.nanoTime(); 
    Log.d(TAG, String.format(Locale.getDefault(), "Receiving %s in %s%n%s", response.request().url(), ((timeResponse - timeRequest)/1e6d), response.headers())); 
    Log.d(TAG, "Data: " + response.body().string()); 
    Log.d(TAG, "Code: " + response.code()); 

    return response; 
} 

}

А вот как я добавить его клиенту Okhttp

private OkHttpClient createHttpClient(){ 
    if(client == null){ 

     String strUserAgent = "tm-vc=" + BuildConfig.VERSION_CODE + "-devid=" + (getDeviceID().isEmpty() ? "0" : getDeviceID()); 
     HashMap<String, String> headers = new HashMap<>(); 
     headers.put(HEADER_ACCEPT,  "application/json; charset=utf-8"); 
     headers.put(HEADER_USER_AGENT, strUserAgent); 
     String cookie = getSessionCookie(); 
     if(cookie != null && !cookie.isEmpty()) 
      headers.put(HEADER_COOKIE, cookie); 

     OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
     builder.addInterceptor(new LoggingInterceptor(headers)); 
     builder.retryOnConnectionFailure(true); 
     client = builder.build(); 
    } 
    return client; 
} 

Чтобы проверить, что я сказал, что просто нужно прокомментируйте эту строку builder.addInterceptor(new LoggingInterceptor(headers));, если вы прокомментируете строку, вызывается и выполняется переоснащение onResponse (работает, json получает синтаксический анализ), если не вызывается onFailure.

ТАК, что мне не хватает на реализацию собственной перехватчика?

ЧТО ТАКОЕ СЕБЯ ВОПРОС? Как добавить заголовки в запрос с использованием перехватчиков?

Да, я могу сделать с аннотациями, но значение заголовков будет статическим.

Примечание: Im используя полностью обновить ДООСНАСТКЕ 2.

+0

Почему вы не используете HttpLoggingInterceptor? https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor –

+0

@ robert-banyai Это тоже не удается, а также мне нужно добавить в него заголовки – AlexSanchez

+0

Извините, но вы все равно не понимаете свою проблему, вы может добавить к вашему клиенту более одного перехватчика. Я использую то же самое и прекрасно работаю. –

ответ

1

Вы можете использовать HttpLoggingInterceptor с Модернизированный 2 следующим

1) Клиент API

// imports 
import okhttp3.OkHttpClient; 
import okhttp3.logging.HttpLoggingInterceptor; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

--- 

// Method to create instance of Service 
public ApiService getService() { 

    // Interceptor to Log the Request 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    // Level.BODY prints Urls, Params and Response 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

    // Create the Client 
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

    // Initialize retrofit instance 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    // Creates the instance of Web Service Representation 
    return retrofit.create(ApiService.class); 
} 

2) Зависимости от градля

// Retrofit 2 dependency 
compile 'com.squareup.retrofit2:retrofit:2.1.0' 
// GSON for Parsing into POJOs 
compile 'com.squareup.retrofit2:converter-gson:2.0.2' 
// Logging Interceptor to Log the Request 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
// OK HTTP dependency (for Compatibility) 
compile 'com.squareup.okhttp3:okhttp:3.4.1' 

3) Точно так же вы можете добавить свои собственные настройки (например, заголовки) в Модифицированные

+0

ваше решение работает, но таким образом я не могу вставлять заголовки запросов в запрос и в этом [пример] (https: // github.com/square/okhttp/wiki/Interceptors) говорит, что это возможно. Я попытался скопировать этот образец и добавить некоторые функции, но он не сработал. – AlexSanchez

+0

Оформить заказ: * [См., Может ли это решить вашу проблему.] (Http://stackoverflow.com/a/35024248/6213557) Примечание: Перехватчики заказаны. –

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

  • Нет связанных вопросов^_^