Как войти запрос и ответ тела с Retrofit-Android?
Я не могу найти соответствующие методы в API Retrofit для регистрации полных тел запросов/ответов. Я
ожидал некоторую помощь в Профилировщике (но он предлагает только метаданные об ответе). Я попытался установить уровень журнала в Построителе, но это мне тоже не помогает:
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: этот код работает сейчас. Я не знаю, почему это не сработало раньше. Возможно, потому что я использовал более старую версию модернизации.
7 ответов:
Я
setLogLevel(LogLevel.FULL).setLog(new AndroidLog("YOUR_LOG_TAG")), Он помог мне.
обновление.
вы также можете попробовать для отладки использования целиretrofit.client.Responseкак модель ответ
Ретрофит 2.0:
обновление: @by Marcus Pöhls
Вход В Retrofit 2
Retrofit 2 полностью полагается на OkHttp для любой работы в сети. Поскольку OkHttp является одноранговой зависимостью Retrofit 2, вам не нужно будет добавлять дополнительную зависимость после выпуска Retrofit 2 в качестве стабильного выпуска.
OkHttp 2.6.0 поставляется с перехватчиком регистрации в качестве внутренней зависимости, и вы можете напрямую использовать его для вашего клиента дооснащения. Дооснащение 2.0.0-beta2 по-прежнему использует OkHttp 2.5.0. Будущие релизы повысят зависимость от более высоких версий OkHttp. Вот почему вам нужно вручную импортировать перехватчик журналов. Добавьте следующую строку к импорту gradle в вашей сборке.файл gradle для извлечения зависимости перехватчика журнала.
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'вы также можете посетить страницу GitHub Square об этом перехватчике
добавить ведение журнала для дооснащения 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 монитор, поэтому OkHttp logging interceptor имеет четыре уровня журнала: NONE, BASIC, HEADERS, BODY. Мы проведем вас через каждый из уровней журнала и опишем их выход.
дополнительная информация, пожалуйста, посетите:Retrofit 2-Log запросы и ответы
старый Ответ:
больше нет входа в Retrofit 2. Команда разработчиков удалила функцию ведения журнала. Честно говоря, функция ведения журнала не была настолько надежной в любом случае. Джейк Уортон явно заявил, что зарегистрированные сообщения или объекты являются предполагаемыми значениями, и они не могут быть проверены на истинность. Фактический запрос, который поступает на сервер, может иметь измененное тело запроса или что-то еще.
несмотря на то, что по умолчанию нет интегрированного ведения журнала, вы можете использовать любой регистратор Java и использовать его в рамках настраиваемого перехватчика OkHttp.
дополнительную информацию о Retrofit 2 см. : Retrofit-начало работы и создание клиента Android
обновление для дооснащения 2.0.0-beta3
Теперь вы должны использовать okhttp3 с builder. Также не будет работать старый перехватчик. Этот ответ адаптирован для 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); } } }бонус
Я знаю, что это Оффтопик, но я нахожу это круто.
в случае, если есть код ошибки 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 (мой проект).
похоже, что нет способа сделать basic + body, но вы можете использовать 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 ]Так что это должно быть легко войти basic + body, регулируя пользовательский фильтр. Я использую черный список, но список может также быть использован в зависимости от ваших потребностей.
ниже код работает как с заголовком, так и без заголовка для печати запроса журнала и ответа. Примечание: просто комментарий .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();
для 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
Comments