【问题标题】:OkHttp interceptor doesn't get called from Observable没有从 Observable 调用 OkHttp 拦截器
【发布时间】:2015-10-05 01:47:32
【问题描述】:

我正在尝试在 Android 中为我的 RX Observable 调用编写单元测试。我正在像这样设置我的 Retrofit RestAdapter:

        RestAdapter.Builder restAdapter = new RestAdapter.Builder();
        restAdapter
                .setEndpoint(BuildConfig.API_URL)
                .setConverter(new GsonConverter(getGson()))
                .setClient(new OkClient(getHttpClient()));

我正在向它传递一个像这样的 OkHttpClient:

OkHttpClient client = new OkHttpClient();
client.interceptors().add(new AuthenticationInterceptor());

但是,我的 Observable 调用都没有被拦截。事实上,网络调用似乎根本没有启动。有人遇到过类似的问题吗?

编辑: 这是我从单元测试中调用 Observable 的方式

TestSubscriber<User> testSubscriber = new TestSubscriber<>();
    mLoginUtils.doEmailLogin("customer", new AuthCredentials("test@mail.com", "testpassword")).subscribe(testSubscriber);

【问题讨论】:

  • 使用 Retrofit 1.8 时出现同样的错误,但使用 Retrofit 1.9+ 时效果很好

标签: android retrofit rx-java observable okhttp


【解决方案1】:

你需要订阅 Observable,否则它不会被触发。

显然 Retrofit 将其实现为“冷可观察对象”。

来自ReactiveX docs

另一方面,一个“冷”的 Observable 等到观察者 在它开始发出项目之前订阅它,所以这样的 观察者保证从头看到整个序列。

【讨论】:

  • 我是这样订阅的:doEmailLogin("customer", new AuthCredentials("test@mail.com", "testpassword")).subscribe(testSubscriber);
【解决方案2】:

我不确定为什么没有调用您的 OkHttp 拦截器。我一直使用 Retrofit 请求拦截器。如果您只是想添加一个适合您的身份验证标头。这是一个基于对我有用的代码的示例:

// Create the OkHttp client        
OkHttpClient okHttpClient = new OkHttpClient();
SSLContext sslContext;
try {
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, null, null);
} catch (GeneralSecurityException e) {
    throw new AssertionError(); // The system has no TLS. Just give up.
}
Client client = okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());

// Create the Retrofit RestAdapter
RestAdapter.LogLevel logLevel = BuildConfig.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE;
return new RestAdapter.Builder()
        .setEndpoint(BuildConfig.API_URL)
        .setClient(client)
        .setConverter(new GsonConverter(getGson()))
        .setRequestInterceptor(new RetrofitAuthenticationInterceptor())
        .setLogLevel(logLevel)
        .build()
        .create(ApiServiceV1.class);

【讨论】:

  • 谢谢,但主要问题是我的网络调用没有通过我的单元测试(基于 jvm)。这就是为什么我担心请求拦截器没有启动 - 因为这证明了我的症状。
猜你喜欢
  • 2017-07-03
  • 2015-04-16
  • 2020-01-17
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2019-12-28
  • 1970-01-01
相关资源
最近更新 更多