访问改进服务器请求和响应时间Android

时间:2014-10-21 12:38:54

标签: android retrofit

我可以看到每当我进行一次web svc调用时,我都会在日志中得到响应。但我发现在我的代码中实际访问该信息很困难。例如,我如何找到我可以从以下日志中看到的服务器请求时间和响应时间。

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/json;charset=UTF-8
Date: Tue, 21 Oct 2014 12:35:26 GMT
OkHttp-Received-Millis: 1413894922514
OkHttp-Response-Source: NETWORK 200
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1413894921354
Server: Apache-Coyote/1.1
transfer-encoding: chunked

3 个答案:

答案 0 :(得分:3)

In Retrofit< 2.0,使用RestAdapter.setProfiler()获取请求的指标。

警告 - this will been removed in Retrofit 2.0并将被广义的拦截系统取代。

例如:

new RestAdapter.Builder()
    .setEndpoint("http://www.google.com")
    .setProfiler(new Profiler() {
        @Override
        public Object beforeCall() {
          return null;
        }

        @Override
        public void afterCall(RequestInformation requestInfo, long elapsedTime, int statusCode, Object beforeCallData) {
          Log.d("Retrofit Profiler", String.format("HTTP %d %s %s (%dms)",
              statusCode, requestInfo.getMethod(), requestInfo.getRelativePath(), elapsedTime));
        }
    })
    .create(MyService.class);

以下是一些示例输出:

D/Retrofit Profiler﹕ HTTP 200 GET /users/me (200ms)

答案 1 :(得分:2)

在您的回调中,您可以访问具有getHeaders()方法的Response对象,为您提供一堆Headers

正如您所看到的,Header只是一个名称 - 值对,所以我认为处理它们不会有任何问题。

答案 2 :(得分:2)

我正在使用的库和版本:

Retrofit版本:2.1.0

okhttp版本:3.3.1

logging-interceptor版本:3.3.1

  

此方法仅在onResponse()中有效。

如果调试onResponse(),将在sentRequestAtMillis部分看到receivedResponseAtMillisrawResponse,如下图所示。

这些参数分别保存发出请求和接收响应的时间(以毫秒为单位)。

enter image description here

以下示例说明了如何在收到响应后以编程方式获取这些参数中的值。

retrofitRequest.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> 
        // time when the request was made to server, which you get from ```sentRequestAtMillis```
        long requestTime = response.raw().sentRequestAtMillis();

        // time when the response was received, which you get from ```receivedResponseAtMillis```
        long responseTime = response.raw().receivedResponseAtMillis();

        //time taken to receive the response after the request was sent
        long apiTime =  responseTime - requestTime;
    }

    @Override public void onFailure(Call<ResponseBody> call, Throwable t) {

    }
});

请注意,对于可能发生的任何异常,您可能需要处理代码。