Ответ 1
Я использовал setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG"))
, это помогло мне.
UPDATE.
Вы также можете попробовать использовать функцию отладки retrofit.client.Response
в качестве модели ответа
Я не могу найти соответствующие методы в API Retrofit для регистрации полных тел запроса/ответа. я ожидал некоторой помощи в 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();
EDIT: этот код работает сейчас. Я не знаю, почему он не работал раньше. Возможно, потому, что я использовал более старую версию модификации.
Я использовал setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG"))
, это помогло мне.
UPDATE.
Вы также можете попробовать использовать функцию отладки retrofit.client.Response
в качестве модели ответа
Дооснащение 2.0 :
ОБНОВЛЕНИЕ: @by Marcus Pöhls
Вход в систему до 2
Retrofit 2 полностью полагается на OkHttp для любой сетевой операции. Так как OkHttp является зависимой зависимостью Retrofit 2, вам не нужно добавлять дополнительную зависимость после выпуска Retrofit 2 в качестве стабильной версии.
OkHttp 2.6.0 поставляется с перехватчиком регистрации как внутренней зависимостью, и вы можете напрямую использовать его для своего клиента Retrofit. Retrofit 2.0.0-beta2 по-прежнему использует OkHttp 2.5.0. В будущих выпусках будет увеличена зависимость от более высоких версий OkHttp. Вот почему вам нужно вручную импортировать перехватчик регистрации. Добавьте следующую строку в свой импорт gradle в файле build.gradle, чтобы получить зависимость от перехватчика ведения журнала.
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'
Вы также можете посетить страницу Square GitHub об этом перехватчике
Добавить запись в журнал дооснащения 2
При разработке приложения и в целях отладки было бы неплохо иметь встроенную функцию регистрации, чтобы показать информацию о запросах и ответах. Поскольку ведение журнала больше не интегрировано по умолчанию в 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();
Мы рекомендуем добавить протоколирование в качестве последнего перехватчика, поскольку при этом также будет регистрироваться информация, которую вы добавили с предыдущими перехватчиками в свой запрос.
Уровни журнала
Регистрация слишком большого количества информации взорвет ваш монитор Android, поэтому перехватчик ведения журнала OkHttps имеет четыре уровня регистрации: NONE, BASIC, HEADERS, BODY. Хорошо проведем вас по всем уровням журнала и опишем их результаты.
Для получения дополнительной информации посетите: Модификация 2 - Журнал запросов и ответов
СТАРЫЙ ОТВЕТ:
нет входа в Retrofit 2 больше. Команда разработчиков удалила функцию ведения журнала. Честно говоря, функция регистрации не была настолько надежной в любом случае. Джейк Уортон прямо заявил, что зарегистрированные сообщения или объекты являются предполагаемыми значениями, и они не могут быть подтверждены, чтобы быть правдой. Фактический запрос, поступающий на сервер, может иметь измененное тело запроса или что-то еще.
Несмотря на то, что по умолчанию нет встроенного ведения журнала, вы можете использовать любое средство ведения журнала Java и использовать его в настраиваемом перехватчике OkHttp.
дополнительную информацию о модернизации 2, пожалуйста, обратитесь: Модернизация - начало работы и создание клиента Android
Обновление для Retrofit 2.0.0-beta3
Теперь вы должны использовать okhttp3 с создателем. Также старый перехватчик не будет работать. Этот ответ настроен для 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. Проверьте этот пример кода:
с новым импортом. Вы можете удалить 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);
}
}
}
Bonus
Я знаю, что это оффтоп, но я считаю, что это круто.
Если есть код ошибки 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 ]
поэтому нужно легко зарегистрировать базовое тело +, отрегулировав настраиваемый фильтр. Я использую черный список, но белый список также можно использовать в зависимости от ваших потребностей.
ниже код работает как с заголовком, так и без заголовка для печати запроса журнала и ответа. Примечание. Просто комментируйте строку .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, вам нужно знать, что Interceptor работает по очереди. Поэтому добавьте 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();
Надеюсь, этот код поможет вам войти в систему.
вам просто нужно добавить перехватчик в Build.Gradle
, а затем сделать RetrofitClient
.
Добавьте эту строку в свой build.gradle
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
Сделайте ваш клиент для модернизации
public class RetrofitClient {
private Retrofit retrofit;
private static OkHttpClient.Builder httpClient =
new OkHttpClient.Builder();
private static RetrofitClient instance = null;
private static ApiServices service = null;
private static HttpLoggingInterceptor logging =
new HttpLoggingInterceptor();
private RetrofitClient(final Context context) {
httpClient.interceptors().add(new Interceptor() {
@Override
public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
Request originalRequest = chain.request();
Request.Builder builder = originalRequest.newBuilder().
method(originalRequest.method(), originalRequest.body());
okhttp3.Response response = chain.proceed(builder.build());
/*
Do what you want
*/
return response;
}
});
if (BuildConfig.DEBUG) {
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
// add logging as last interceptor
httpClient.addInterceptor(logging);
}
retrofit = new Retrofit.Builder().client(httpClient.build()).
baseUrl(Constants.BASE_URL).
addConverterFactory(GsonConverterFactory.create()).build();
service = retrofit.create(ApiServices.class);
}
public static RetrofitClient getInstance(Context context) {
if (instance == null) {
instance = new RetrofitClient(context);
}
return instance;
}
public ApiServices getApiService() {
return service;
}
}
RetrofitClient.getInstance(context).getApiService().yourRequestCall();
Для Android Studio до 3.0 (с использованием Android Motinor)
https://futurestud.io/tutorials/retrofit-2-log-requests-and-responses
https://www.youtube.com/watch?v=vazLpzE5y9M
И для Android Studio от 3.0 и выше (использование Android Profiler в качестве монитора Android заменен Android Profiler)
https://futurestud.io/tutorials/retrofit-2-analyze-network-traffic-with-android-studio-profiler
ZoomX - Android Logger Interceptor - отличный перехватчик, который может помочь вам решить вашу проблему.