카테고리 보관물: Java

Java

Retrofit 2로 모든 요청에 ​​헤더 추가 ​​추가해야하는 헤더는 OkHttp 인터셉터를

Retrofit 2의 문서 내용 :

모든 요청에 ​​추가해야하는 헤더는 OkHttp 인터셉터를 사용하여 지정할 수 있습니다.

이전 버전을 사용하여 쉽게 할 수 있습니다 . 여기 관련 QA가 있습니다.

하지만 개조 2를 사용 하면 물체에 적용 할 수있는 방법 setRequestInterceptor이나 setInterceptor방법을 찾을 수 없었습니다 Retrofit.Builder.

또한 더있을 것으로 보인다 RequestInterceptor에서 OkHttp을 더 이상. Retrofit의 문서는 Interceptor 를이 목적으로 사용하는 방법을 잘 이해하지 못했습니다.

어떻게 할 수 있습니까?



답변

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request().newBuilder().addHeader("parameter", "value").build();
        return chain.proceed(request);
    }
});
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url).client(httpClient.build()).build();

답변

최신 개조 버전은 여기에서-> 2.1.0.

람다 버전 :

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").build();
    return chain.proceed(request);
  });

못생긴 긴 버전 :

  builder.addInterceptor(new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
      Request request = chain.request().newBuilder().addHeader("key", "value").build();
      return chain.proceed(request);
    }
  });

풀 버전:

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

  builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().addHeader("key", "value").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);
  }
}

gradle 파일 (사용하려는 경우 로깅 인터셉터를 추가해야 함) :

  //----- Retrofit
  compile 'com.squareup.retrofit2:retrofit:2.1.0'
  compile "com.squareup.retrofit2:converter-gson:2.1.0"
  compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
  compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'

답변

요청 및 응답을 로깅하려면 인터셉터가 필요하고 헤더를 설정하려면 인터셉터가 필요합니다. 다음은 개조 2.1을 사용하여 한 번에 두 인터셉터를 추가하는 솔루션입니다.

 public OkHttpClient getHeader(final String authorizationValue ) {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .addNetworkInterceptor(
                        new Interceptor() {
                            @Override
                            public Response intercept(Interceptor.Chain chain) throws IOException {
                                Request request = null;
                                if (authorizationValue != null) {
                                    Log.d("--Authorization-- ", authorizationValue);

                                    Request original = chain.request();
                                    // Request customization: add request headers
                                    Request.Builder requestBuilder = original.newBuilder()
                                            .addHeader("Authorization", authorizationValue);

                                    request = requestBuilder.build();
                                }
                                return chain.proceed(request);
                            }
                        })
                .build();
        return okClient;

    }

이제 개조 개체에서이 헤더를 클라이언트에 추가하십시오.

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getHeader(authorizationValue))
                .addConverterFactory(GsonConverterFactory.create())
                .build();

답변

Retrofit 1.9 및 2.0에 대해이 유형 헤더를 사용해보십시오. Json 콘텐츠 유형의 경우.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

더 많은 헤더를 추가 할 수 있습니다.

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })

헤더에 동적으로 추가 :

@POST("user/classes")
Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);

당신에게 방법을 호출하십시오.

mAPI.addToPlayList("application/json", playListParam);

또는

매번 전달하고 http 인터셉터를 사용하여 HttpClient 개체를 만듭니다.

OkHttpClient httpClient = new OkHttpClient();
        httpClient.networkInterceptors().add(new Interceptor() {
            @Override
            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
                Request.Builder requestBuilder = chain.request().newBuilder();
                requestBuilder.header("Content-Type", "application/json");
                return chain.proceed(requestBuilder.build());
            }
        });

그런 다음 개조 개체에 추가

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();

Kotlin을 사용하는 경우 업데이트 하면 { }작동하지 않습니다.


답변

제 경우에는 addInterceptor()요청에 HTTP 헤더를 추가하는 데 작동하지 않았으므로 addNetworkInterceptor(). 코드는 다음과 같습니다.

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addNetworkInterceptor(new AddHeaderInterceptor());

그리고 인터셉터 코드 :

public class AddHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("Authorization", "MyauthHeaderContent");

        return chain.proceed(builder.build());
    }
}

요점 에 대한 이것과 더 많은 예


답변

HttpLoggingInterceptor를 추가하기 위해 addInterceptor 메소드를 사용하는 경우 HttpLoggingInterceptor 이후에 적용된 다른 인터셉터에 의해 추가 된 항목은 로깅되지 않습니다.

예 : 두 개의 인터셉터 “HttpLoggingInterceptor”및 “AuthInterceptor”가 있고 HttpLoggingInterceptor가 먼저 적용된 경우 AuthInterceptor에서 설정 한 http-params 또는 헤더를 볼 수 없습니다.

OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(logging)
.addInterceptor(new AuthInterceptor());

addNetworkInterceptor 메서드를 사용하여 해결했습니다.


답변

이 개조 클라이언트 사용

class RetrofitClient2(context: Context) : OkHttpClient() {

    private var mContext:Context = context
    private var retrofit: Retrofit? = null

    val client: Retrofit?
        get() {
            val logging = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

            val client = OkHttpClient.Builder()
                    .connectTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
                    .readTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
                    .writeTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
            client.addInterceptor(logging)
            client.interceptors().add(AddCookiesInterceptor(mContext))

            val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create()
            if (retrofit == null) {

                retrofit = Retrofit.Builder()
                        .baseUrl(Constants.URL)
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .client(client.build())
                        .build()
            }
            return retrofit
        }
}

모든 요청과 함께 JWT를 전달하고 있습니다. 변수 이름에 신경 쓰지 마십시오. 약간 혼란 스럽습니다.

class AddCookiesInterceptor(context: Context) : Interceptor {
    val mContext: Context = context
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        val builder = chain.request().newBuilder()
        val preferences = CookieStore().getCookies(mContext)
        if (preferences != null) {
            for (cookie in preferences!!) {
                builder.addHeader("Authorization", cookie)
            }
        }
        return chain.proceed(builder.build())
    }
}