Retrofit-Android로 요청 및 응답 본문을 기록하는 방법?


Answers

개장 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 페이지를 방문 할 수도 있습니다.

개조 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();

마지막 인터셉터로 로깅을 추가하는 것이 좋습니다. 이렇게하면 이전 인터셉터로 추가 한 정보가 요청에 기록되기 때문입니다.

로그 수준

너무 많은 정보를 로깅하면 안드로이드 모니터가 날아갑니다. OkHttp의 로깅 인터셉터는 NONE, BASIC, HEADERS, BODY의 4 가지 로그 레벨을 가지고 있습니다. 각 로그 수준을 살펴보고 결과를 설명합니다.

추가 정보는 다음을 방문하십시오 : 갱신 2 - 요청 및 응답 기록

이전 답 :

더 이상 개장하지 않아도됩니다. 개발 팀은 로깅 기능을 제거했습니다. 솔직히 로깅 기능은 그다지 신뢰할 수 없습니다. 제이크 와튼 (Jake Wharton)은 기록 된 메시지 나 객체가 가정 된 값이며 진실임을 입증 할 수 없다고 명시 적으로 진술했다. 서버에 도착한 실제 요청에는 변경된 요청 본문 또는 다른 것이있을 수 있습니다.

기본적으로 통합 로깅은 없지만 Java 로거를 활용하여 사용자 정의 된 OkHttp 인터셉터 내에서 사용할 수 있습니다.

Retrofit 2에 대한 자세한 내용은 다음을 참조하십시오. Retrofit - Android 클라이언트 시작하기 및 만들기

Question

완전한 요청 / 응답 본문을 로깅 할 수있는 Retrofit API에서 관련 메소드를 찾을 수 없습니다. 프로필러에서 일부 도움이 필요했습니다 (단, 응답에 대한 메타 데이터 만 제공함). 나는 빌더에서 로그 레벨을 설정하려고 시도했으나 이것은 나에게 도움이되지 않는다.

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();

편집 :이 코드는 지금 작동합니다. 왜 일찍 일하지 않았는지 나는 모른다. 이전 버전의 개조를 사용했기 때문일 수 있습니다.




기본 + 본문을 수행하는 방법이없는 것처럼 보일 수 있지만 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 ]

따라서 사용자 정의 필터를 조정하여 기본 + 본문을 쉽게 기록 할 수 있어야합니다. 블랙리스트를 사용하고 있지만 필요에 따라 화이트리스트를 사용할 수도 있습니다.




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();