Retrofit-Android로 요청 및 응답 본문을 기록하는 방법은 무엇입니까?
완전한 요청 / 응답 본문을 기록하기 위해 Retrofit API에서 관련 메소드를 찾을 수 없습니다. 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"))
했다.
최신 정보. 응답 모델로
디버그 목적으로 사용할 수도 있습니다.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 버전에 대한 종속성이 떨어질 것입니다. 그렇기 때문에 로깅 인터셉터를 수동으로 가져와야합니다. build.gradle 파일 내의 gradle 가져 오기에 다음 행을 추가하여 로깅 인터셉터 종속성을 가져 오십시오.
compile 'com.squareup.okhttp3:logging-interceptor:3.9.0'
이 인터셉터에 대한 Square의 GitHub 페이지를 방문 할 수도 있습니다.
Retrofit 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의 로깅 인터셉터에는 NONE, BASIC, HEADERS, BODY의 네 가지 로그 레벨이 있습니다. 각 로그 레벨을 안내하고 해당 출력을 설명합니다.
자세한 내용은 다음 사이트를 방문하십시오 : Retrofit 2 — 로그 요청 및 응답
오래된 답변 :
더 이상 Retrofit 2에 로그인하지 않습니다. 개발 팀은 로깅 기능을 제거했습니다. 솔직히 로깅 기능은 그다지 신뢰할 수 없었습니다. 제이크 와튼 (Jake Wharton)은 기록 된 메시지 나 객체가 가정 된 값이며 실제로는이를 증명할 수 없다고 명시했습니다. 서버에 도착한 실제 요청에는 요청 본문이 변경되었거나 다른 것이있을 수 있습니다.
기본적으로 통합 로깅이 없지만 Java 로거를 활용하여 사용자 정의 된 OkHttp 인터셉터 내에서 사용할 수 있습니다.
Retrofit 2에 대한 자세한 내용은 다음을 참조하십시오 : Retrofit — 시작 및 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);
}
}
}
보너스
나는 그것이 주제가 아닌 것을 알고 있지만 멋지다.
무허가 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 ]
맞춤 필터를 조정하여 기본 + 본문을 쉽게 기록 할 수 있어야합니다. 블랙리스트를 사용하고 있지만 필요에 따라 화이트리스트를 사용할 수도 있습니다.
below code is working for both with header and without header to print log request & response. Note: Just comment .addHeader() line if are not using header.
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();
If you are using Retrofit2 and okhttp3 then you need to know that Interceptor works by queue. So add loggingInterceptor at the end, after your other Interceptors:
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();
I hope this code will help you to logging .
you just need to add interceptor in your Build.Gradle
then make RetrofitClient
.
First Step
Add this line to your build.gradle
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
Second Step
Make your Retrofit Client
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;
}
}
Calling
RetrofitClient.getInstance(context).getApiService().yourRequestCall();
For android studio before 3.0 (using android motinor)
https://futurestud.io/tutorials/retrofit-2-log-requests-and-responses
https://www.youtube.com/watch?v=vazLpzE5y9M
And for android studio from 3.0 and above (using android profiler as android monitor is replaced by android profiler)
https://futurestud.io/tutorials/retrofit-2-analyze-network-traffic-with-android-studio-profiler
ZoomX — Android Logger Interceptor is a great interceptor can help you to solve your problem.
'development' 카테고리의 다른 글
라 라벨-Route :: resource vs Route :: controller (0) | 2020.07.20 |
---|---|
C # 6의 긴 문자열 보간 라인 (0) | 2020.07.20 |
C ++ 03과 C ++ 11의 런타임에 어떤 차이가 감지 될 수 있습니까? (0) | 2020.07.20 |
C #에서 제네릭과 공분산의 공분산 이해 문제 (0) | 2020.07.20 |
소스 코드를 자동으로 들여 쓰는 방법? (0) | 2020.07.20 |