如何使用Retrofit-Androidlogin请求和响应正文?

在Retrofit API中找不到相关方法来logging完整的请求/响应主体。 我期待在Profiler中获得一些帮助(但它只提供有关响应的元数据)。 我尝试在Builder中设置日志级别,但是这对我也没有帮助:

RestAdapter adapter = (new RestAdapter.Builder()). setEndpoint(baseUrl). setRequestInterceptor(interceptor). setProfiler(profiler). setClient(client). setExecutors(MyApplication.getWebServiceThreadPool()). setLogLevel(LogLevel.FULL). setLog(new RestAdapter.Log() { @Override public void log(String msg) { Log.i(TAG, msg); } }). build(); 

编辑:此代码正在工作。 我不知道为什么它不工作。 可能是因为我正在使用一些老版本的改造。

我用setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG")) ,它帮助了我。
UPDATE。
您也可以尝试使用retrofit.client.Response作为响应模型进行debugging

改进2.0

更新:@by MarcusPöhls

login改造2

Retrofit 2完全依赖OkHttp进行任何networking操作。 由于OkHttp是Retrofit 2的对等依赖项,因此一旦Retrofit 2作为稳定版本发布,就不需要添加额外的依赖项。

OkHttp 2.6.0提供了一个日志拦截器作为内部依赖,你可以直接使用它作为你的Retrofit客户端。 Retrofit 2.0.0-beta2仍然使用OkHttp 2.5.0。 未来的版本会将依赖性提升到更高的OkHttp版本。 这就是为什么你需要手动导入日志拦截器。 将以下行添加到您的build.gradle文件中的gradle导入中以获取日志logging拦截器依赖项。

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

你也可以访问关于这个拦截器的Square的GitHub页面

添加logging到改造2

在开发您的应用程序和进行debugging时,最好有集成的日志function来显示请求和响应信息。 由于在Retrofit 2中日志不是默认集成的,我们需要为OkHttp添加一个日志拦截器。 幸运的是,OkHttp已经发布了这个拦截器,你只需要为你的OkHttpClient激活它。

 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); // set your desired log level logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); // add your other interceptors … // add logging as last interceptor httpClient.addInterceptor(logging); // <-- this is the important line! Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(httpClient.build()) .build(); 

我们build议添加日志logging作为最后一个拦截器,因为这也会logging您添加了以前拦截器的信息到您的请求。

日志级别

logging太多的信息会炸毁你的Android监视器,这就是为什么OkHttp的日志拦截器有四个日志级别:无,基本,标题,身体。 我们将逐步介绍每个日志级别并描述它们的输出。

更多信息请访问: 改造2 – 日志请求和响应

老解答:

没有login在Retrofit 2了。 开发团队删除了日志function。 说实话,loggingfunction不是那么可靠。 杰克·沃顿(Jake Wharton)明确表示,所logging的信息或对象是假设值,不能certificate是真实的。 到达服务器的实际请求可能有更改的请求主体或其他内容。

即使默认情况下没有集成日志logging,您也可以利用任何Javalogging器,并在自定义的OkHttp拦截器中使用它。

有关Retrofit 2的更多信息,请参阅: Retrofit – 入门和创buildAndroid客户端

更新2.0.0-beta3更新

现在你必须使用okhttp3与build设者。 老拦截器也不行。 这个回应是针对Android量身打造的。

这里有一个快速复制粘贴为你的新东西。

1.修改你的gradle文件

  compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3' compile "com.squareup.retrofit2:converter-gson:2.0.0-beta3" compile "com.squareup.retrofit2:adapter-rxjava:2.0.0-beta3" compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' 

2.检查这个示例代码:

与新的import。 你可以删除Rx,如果你不使用它,也删除你不使用。

 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.GsonConverterFactory; import retrofit2.Retrofit; import retrofit2.RxJavaCallAdapterFactory; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; public interface APIService { String ENDPOINT = "http://api.openweathermap.org"; String API_KEY = "2de143494c0b2xxxx0e0"; @GET("/data/2.5/weather?appid=" + API_KEY) Observable<WeatherPojo> getWeatherForLatLon(@Query("lat") double lat, @Query("lng") double lng, @Query("units") String units); class Factory { public static APIService create(Context context) { OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(5, TimeUnit.SECONDS); if (BuildConfig.DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC); builder.addInterceptor(interceptor); } //Extra Headers //builder.addNetworkInterceptor().add(chain -> { // Request request = chain.request().newBuilder().addHeader("Authorization", authToken).build(); // return chain.proceed(request); //}); builder.addInterceptor(new UnauthorisedInterceptor(context)); OkHttpClient client = builder.build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); return retrofit.create(APIService.class); } } } 

奖金

我知道这是不重要的,但我觉得很酷。

如果有一个未经授权的http错误代码,这里是一个拦截器。 我使用eventbus传输事件。

 import android.content.Context; import android.os.Handler; import android.os.Looper; import com.androidadvance.ultimateandroidtemplaterx.BaseApplication; import com.androidadvance.ultimateandroidtemplaterx.events.AuthenticationErrorEvent; import de.greenrobot.event.EventBus; import java.io.IOException; import javax.inject.Inject; import okhttp3.Interceptor; import okhttp3.Response; public class UnauthorisedInterceptor implements Interceptor { @Inject EventBus eventBus; public UnauthorisedInterceptor(Context context) { BaseApplication.get(context).getApplicationComponent().inject(this); } @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); if (response.code() == 401) { new Handler(Looper.getMainLooper()).post(() -> eventBus.post(new AuthenticationErrorEvent())); } return response; } } 

代码取自https://github.com/AndreiD/UltimateAndroidTemplateRx (我的项目)。

似乎没有办法做基本+正文,但是你可以使用FULL并过滤你不想要的标题。

 RestAdapter adapter = new RestAdapter.Builder() .setEndpoint(syncServer) .setErrorHandler(err) .setConverter(new GsonConverter(gson)) .setLogLevel(logLevel) .setLog(new RestAdapter.Log() { @Override public void log(String msg) { String[] blacklist = {"Access-Control", "Cache-Control", "Connection", "Content-Type", "Keep-Alive", "Pragma", "Server", "Vary", "X-Powered-By"}; for (String bString : blacklist) { if (msg.startsWith(bString)) { return; } } Log.d("Retrofit", msg); } }).build(); 

看来在覆盖日志的时候,身体前缀的标签类似于

 [ 02-25 10:42:30.317 25645:26335 D/Retrofit ] 

因此通过调整自定义filter来logging基本+正文应该很容易。 我正在使用黑名单,但也可以根据您的需要使用白名单。

下面的代码是为头和无头打印日志请求和响应。 注意:只要注释.addHeader()行,如果不使用标题。

 HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) //.addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR) .addNetworkInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder() // .addHeader(Constant.Header, authToken) .build(); return chain.proceed(request); } }).build(); final Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.baseUrl) .client(client) // This line is important .addConverterFactory(GsonConverterFactory.create()) .build(); 

如果你正在使用Retrofit2和okhttp3,那么你需要知道拦截器是按队列工作的。 所以在你的其他拦截器之后添加loggingInterceptor:

 HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); if (BuildConfig.DEBUG) loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .addInterceptor(new CatalogInterceptor(context)) .addInterceptor(new OAuthInterceptor(context)) .authenticator(new BearerTokenAuthenticator(context)) .addInterceptor(loggingInterceptor)//at the end .build();