【问题标题】:How to add http interceptor in retrofit in a service generator class如何在服务生成器类的改造中添加 http 拦截器
【发布时间】:2019-05-30 17:14:57
【问题描述】:

我创建了一个单独的服务生成器类,如图所示是本指南https://futurestud.io/tutorials/retrofit-2-manage-request-headers-in-okhttp-interceptor

ApiServiceGenerator.java

public class ApiServiceGenerator {
    private static final String BASE_URL = "http://192.168.0.205/hadia/api/";

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());

    private static Retrofit retrofit = builder.build();

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


    public static <S> S createService(
            Class<S> serviceClass) {

        return retrofit.create(serviceClass);
    }
}

我需要为每个请求添加一个授权标头, 我如何使用这个静态 createService 方法来做到这一点?

这里是如何创建一个拦截器来为每个请求添加标头

httpClient.addInterceptor(new Interceptor() {  
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request original = chain.request();

        // Request customization: add request headers
        Request.Builder requestBuilder = original.newBuilder()
                .header("Authorization", "auth-value"); // <-- this is the important line

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

我如何添加这个方法来为每个请求添加一个 Bearer 令牌?

【问题讨论】:

    标签: android retrofit retrofit2


    【解决方案1】:

    我有一个像这样的Creator

    class Creator {
        public static Services newServices() {
            final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            final OkHttpClient client = new OkHttpClient.Builder()
                    .addInterceptor(interceptor)
                    .build();
    
            final Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(Services.HOST)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create(GsonUtils.get()))
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .build();
            return retrofit.create(Services.class);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用构建改造实例时创建的http客户端。

      Retrofit.Builder()
                      .baseUrl(BASE_URL)
                      .client(httpClient)  // This is the line
                      .addConverterFactory(GsonConverterFactory.create());
      

      【讨论】:

      • 当我添加客户端方法时,它显示非法前向引用!
      • 这意味着您在定义之前引用了httpClient。尝试创建一个工厂/构造函数,将 okhttp 和改造初始化包装在一个静态函数中。
      猜你喜欢
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2022-12-04
      • 2017-02-09
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      相关资源
      最近更新 更多