Как получить запрос API и время отклика API в Android Retrofit API с помощью OkHttp Interceptor для каждого API? - PullRequest
1 голос
/ 17 октября 2019

Я получил время отклика на Api Response с помощью перехватчика OkHttp3 в BODY при отладке, но я хочу время отклика сервера для каждого API в сборке релиза, и я хочу загрузить его для анализа данных в трекере. Я уже испробовал оба метода 1. Response.sentRequestAtMillis () 2. Response.receivedResponseAtMillis () Но я не добился успеха, поэтому, пожалуйста, помогите мне найти время ответа для каждого API, либо это возможно путем вычисления sentRequestAtMillis иreceiveResponseAtMillis ИЛИ получая напрямую, что показано в примере Response Api, например (31мс) .

Запрос API : -

D/OkHttp: --> POST http://api.globoapps.in/abc/updateUserDetail
D/OkHttp: Content-Type: application/json; charset=UTF-8
D/OkHttp: Content-Length: 208
D/OkHttp: {"androidId":"996e831d34ba64b0","id":4,"deviceToken":"abcd"}
D/OkHttp: --> END POST (208-byte body)

Api Response : -

D/OkHttp: <-- 200 http://api.globoapps.in/abc/updateUserDetail (31ms)
D/OkHttp: Server: nginx/1.12.2
D/OkHttp: Date: Thu, 17 Oct 2019 09:30:24 GMT
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Connection: keep-alive
D/OkHttp: {"id":4,"status":"Success"}
D/OkHttp: <-- END HTTP (533-byte body)

Код (MainBaseApplication.java) : -

   public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {

            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();


            httpClient.readTimeout(30, TimeUnit.SECONDS);
            httpClient.connectTimeout(30, TimeUnit.SECONDS);
            httpClient.writeTimeout(30, TimeUnit.SECONDS);

            httpClient.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();

                    Request.Builder builder = original.newBuilder();
                    builder.method(original.method(), original.body());
//                    builder.header("Accept", "application/json");
                    if (TOKEN.length() > 0)
                        builder.header("Authorization", TOKEN);
                    return chain.proceed(builder.build());
                }
            });

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

            OkHttpClient client = httpClient.build();
//            Response response = client.newCall(request).execute();
//             tx = response.sentRequestAtMillis();
//            rx = response.receivedResponseAtMillis();
//            System.out.println("response time : "+(rx - tx)+" ms");
            Gson gson = new GsonBuilder()
                    .setLenient()
                    .create();

            retrofit = new Retrofit.Builder()
                    .baseUrl(WebAPI.BASE_URL)
                    .client(httpClient.build())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();
        }
        return retrofit;
    }

1 Ответ

0 голосов
/ 21 октября 2019

sentRequestAtMillis и receivedResponseAtMillis относятся к времени устройства, а не к времени сервера, если вы измените время устройства, оно также изменится на эти значения.

в соответствии с https://square.github.io/okhttp/4.x/okhttp/okhttp3/-response/received-response-at-millis/ это метка времени из кэшированногоиногда этот метод не работает для вас.

Для вашего решения: вам нужно отправить метку времени из API, и вы можете получить этот параметр из ответа API, и вы можете использовать его.

Если вы хотите получить миллисекунду ответа, например 31ms , вы можете переопределить класс HttpLoggingInterceptor.kt и проверить переменную val tookMs в 222 номере строки, которая вернет вам мс, которую вы хотите .. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...