2017-03-02 31 views
0

我有rxjava(observable)+ retrofit2在一起向我的应用程序发出http请求。我为应用程序创建一次OkHttpClient,并且不想重新创建它。 我已经在可观察的级别上实现了重试逻辑 - 使用过滤器,重试时一起。 我想要什么 - 如果请求从服务器端完成错误,我想重试它,并发送附加头。 所以,我不明白我怎样才能修改可重复的内部重试什么时候,以及如何从拦截器级别获得关于observable的知识。 任何关于可能的方法的想法和/或知识?修改请求/重试之间

+0

我不认为你的建议可以工作。一方面,okhttpclient和Retrofit实例是不可变的。这意味着您不能在客户端构建完成后从客户端添加和删除拦截器。一旦设置完成,您也无法更改改造实例使用的客户端。 – JohnWowUs

+0

你可以编写一个拦截器,在服务器发生故障的情况下,这个拦截器将执行与新头相同的请求。这对你有用吗? – LordRaydenMK

+0

将不同版本的请求想成是完全不同的“可观察”是否有意义?然后,你可以像'Observable.concat(simpleRequest,requestWithExtraHeader).take(1)'这样的东西 - 如果'simpleRequest'未能产生一个项目,它只会订阅'requestWithExtraHeader' ...沿着那条线? –

回答

0

您需要创建自己的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标志。