【问题标题】:Modify request/observable between retry在重试之间修改请求/可观察
【发布时间】:2017-03-02 11:14:41
【问题描述】:

我有 rxjava(observable) + retrofit2 一起向我的应用程序发出 http 请求。我为应用程序创建了一次 OkHttpClient 并且不想重新创建它。 我在可观察级别上实现了重试逻辑 - 一起使用过滤器,retryWhen。 我想要什么 - 如果请求从服务器端完成错误,我想重试它并发送额外的标头。 所以,我既不明白如何在 retryWhen 中修改 observable,也不明白如何从拦截器级别获取有关 observable 的知识。 关于可能的方法的任何想法和/或知识?

【问题讨论】:

  • 我认为你的提议行不通。一方面,okhttpclient 和 Retrofit 实例是不可变的。这意味着一旦构建了客户端,您就无法从客户端添加和删除拦截器。您也无法更改改造实例使用的客户端。
  • 你可以编写一个拦截器,在服务器出现故障的情况下,它会使用一个新的头部来执行相同的请求。这对你有用吗?
  • 将请求的不同版本视为完全不同的Observables 是否有意义?然后你可以订阅Observable.concat(simpleRequest, requestWithExtraHeader).take(1) 之类的东西——如果simpleRequest 未能生成项目,它只会订阅requestWithExtraHeader...类似的东西?
  • 您能提供示例(改造接口和可观察逻辑)吗?

标签: retrofit rx-java retrofit2


【解决方案1】:

您需要创建自己的Interceptor 实现,您可以在其中设置标头逻辑。类似的东西

public class FallbackInterceptor implements Interceptor {
  static String header1Key = "key1";
  static String extraHeaderKey = "key2";
  String header1, extraHeader;
  boolean useextraheader = false;

  public FallbackInterceptor(string header1, string extraheader) {
    this.header1 = header1;
    this.extraheader = extraheader;

  }

  public void setUseExtraHeader(boolean useextraheader) {
    this.userextraheader = useextraheader;
  }

  @Override 
  public Response intercept(Interceptor.Chain chain) throws IOException {
    Request original = chain.request();
    // Add request headers
    Request.Builder requestBuilder = original.newBuilder().header(header1Key, header1);
    if (useExtraHeader) {
        requestBuilder = requestBuilder.header(extraHeaderKey, extraHeader)
    }
    Request newRequest = requestBuilder.method(original.method(), original.body())
                                       .build();
    // Return the response
    return chain.proceed(request);
  }
}

将此添加到 okhttpclient 并让您的改造实例使用它。然后,您可以在重试逻辑中操作 extraheader 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2011-03-25
    • 2017-09-27
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多