Как получить время запроса/ответа API с помощью Retrofit 2

Я использую Retrofit 2.1.0 для анализа API в своем приложении для Android. Мне нужно время, затрачиваемое на модернизацию для разбора API.

Как получить время запроса/ответа с помощью Retrofit 2.

Ниже приведен клиентский вызов Retrofit Rest, который я использую для синтаксического анализа API.

public static class ServiceGenerated {
    static OkHttpClient httpClient = new OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request.Builder ongoing = chain.request().newBuilder();
                    return chain.proceed(ongoing.build());
                }
            })
            .build();


    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(RetrofitUtils.API_BASE_URL)
                    .client(httpClient)
                    .addConverterFactory(GsonConverterFactory.create());


    public static <S> S createService(Class<S> serviceClass) {
        Retrofit retrofit = builder.client(httpClient).build();
        return retrofit.create(serviceClass);
    }

}

person Raghul Sugathan    schedule 10.08.2016    source источник
comment
Вы хотите регистрировать время запроса/ответа?   -  person darwin    schedule 10.08.2016
comment
вам может понадобиться использовать перехватчик. который именно вам нужен здесь https://github.com/square/okhttp/wiki/Interceptors   -  person Ruwanka Madhushan    schedule 11.08.2016
comment
@darwin Да, мне нужен журнал времени запроса или ответа.   -  person Raghul Sugathan    schedule 12.08.2016


Ответы (3)


Попробуй это

   if (BuildConfig.DEBUG) {
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        httpClient.addInterceptor(httpLoggingInterceptor);
    }

также добавить

compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' 

в файл градиента вашего модуля приложения

Пример ответа:

Date: Fri, 12 Aug 2016 07:33:23 GMT
OkHttp-Sent-Millis: 1470987074283
OkHttp-Received-Millis: 1470987074422
person darwin    schedule 12.08.2016
comment
Спасибо за предоставленное решение. Но все же он не предоставляет журнал тайм-аутов. Как распечатать журналы с помощью OkHttp. - person Raghul Sugathan; 12.08.2016
comment
вы получите журнал времени в своей консоли, как указано выше - person darwin; 12.08.2016
comment
Вы используете HttpLoggingInterceptor.Level.BODY в качестве уровня журнала? - person darwin; 12.08.2016
comment
Как мы можем получить время отклика в коде из объекта вызова или объекта запроса? - person ozmank; 09.01.2017

Вы можете рассчитать общее время прохождения туда и обратно, вычитая метку времени при получении ответа и метку времени при отправке запроса. Эти два метода из объекта Response дадут вам эти два значения

  1. Response.sentRequestAtMillis()
  2. Response.receivedResponseAtMillis()

        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        long tx = response.sentRequestAtMillis();
        long rx = response.receivedResponseAtMillis();
        System.out.println("response time : "+(rx - tx)+" ms");
    
person Rakesh    schedule 21.04.2017

Вы можете легко найти receivedResponseAtMillis() и sendResponseAtMillis() в части raw() ответа, а затем вычислить разницу.

response.raw().receivedResponseAtMillis()
response.raw().sendResponseAtMillis()
person Shivam Bhardwaj    schedule 15.01.2019