更改Volley框架的重定向策略

我在一个项目中使用Volley框架,我总是需要自己处理重定向来处理标题。

现在如何处理重定向取决于方法和传输层。 我想在不改变任何Volley代码的情况下使用Volley(自动选择传输层)的默认值。

一个有效的解决方案是始终使用OkHttp作为传输层(如问题和对Volley的贡献中所述),但我想知道是否有一种方法没有额外的框架。

因此,我正在寻找一种“干净”的方式来禁用自动重定向处理。

编辑:

我更喜欢使用OkHttp,这样我就不必管理自己使用什么版本的Android,但是当想要更改传输层行为时,Itai Hanski提供的解决方案非常好。


我认为使用OkHttp作为传输的Volley的HttpStack实现是最好的解决方案

RequestQueue queue = Volley.newRequestQueue(this);

Network network = new BasicNetwork(new OkHttpStack());
RequestQueue queue = new RequestQueue(new DiskBasedCache(new File(getCacheDir(), "volley")), network);
queue.start();

OkHttpStack类:

public class OkHttpStack extends HurlStack {
private final OkHttpClient client;

public OkHttpStack() {
this(new OkHttpClient());
}

public OkHttpStack(OkHttpClient client) {
if (client == null) {
throw new NullPointerException("Client must not be null.");
}
this.client = client;
}

@Override protected HttpURLConnection createConnection(URL url) throws IOException {
return client.open(url);
}
}

更新:如果您使用的是新版本的okhttp堆栈,请使用

public class OkHttpStack extends HurlStack {
    private final OkUrlFactory mFactory;

    public OkHttpStack() {
        this(new OkHttpClient());
    }

    public OkHttpStack(OkHttpClient client) {
        if (client == null) {
            throw new NullPointerException("Client must not be null.");
        }
        mFactory = new OkUrlFactory(client);
    }

    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
       return mFactory.open(url);
    }
}

如果你不关心旧的API(<9),并且你只想在重定向之后停下来,你可以做

RequestQueue requestQueue = Volley.newRequestQueue(context, new HurlStack() {
    @Override
    protected HttpURLConnection createConnection(URL url) throws IOException {
        HttpURLConnection connection = super.createConnection(url);
        connection.setInstanceFollowRedirects(false);

        return connection;
    }
});

该解决方案不需要其他框架:

Volley默认使用AndroidHTTPClient或Apache(如果SDK级别为8或更低)。 你可以在这些类中重写/继承你想要重定向的更改,并用它们创建一个自定义的HttpStack ,并将它提供给Volley.newRequestQueue()

编辑:

假设很长的命名自定义HttpStack实现是你的:

HttpStack stack;
if (Build.VERSION.SDK_INT >= 9) {
    stack = new RedirectionHurlStack();
} else {
    stack = new RedirectionHttpClientStack();
}

sRequestQueue = Volley.newRequestQueue(context, stack);
链接地址: http://www.djcxy.com/p/29495.html

上一篇: Change Redirect Policy of Volley Framework

下一篇: AsyncTask not working on 4.0.4