Изменение политики перенаправления волейбольной платформы

Я использую структуру Volley в проекте, где мне всегда нужно обрабатывать перенаправления самостоятельно для обработки заголовков.

Как обрабатываются переадресации, теперь зависит метод и транспортный уровень. Я бы хотел использовать значения по умолчанию Volley (автоматический выбор транспортного уровня) без изменения кода Volley.

Правильное решение - всегда использовать OkHttp как транспортный уровень (как упоминалось в Проблемы и вклад для Volley), но я хотел бы знать, есть ли без дополнительной структуры.

Поэтому я ищу "чистый" способ отключить автоматическую обработку переадресации.

Edit:

Я предпочитаю использовать OkHttp, так что мне не нужно управлять версией для использования на том, что Android сам, но решение, предоставленное Итай Хански, очень хорошо, когда вы хотите изменить поведение транспортного уровня.

Ответ 1

Я думаю, что реализация A HttpStack для Volley, которая использует OkHttp, поскольку ее транспорт является лучшим решением

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);
}
}

Update:если вы используете новую версию стека 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);
    }
}

Ответ 2

Если вам не нравятся старые 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;
    }
});

Ответ 3

Это решение не требует другой структуры:

Волейбол использует AndroidHTTPClient или Apache (если уровень SDK равен 8 и ниже) по умолчанию. Вы можете переопределить/наследовать изменения, которые вы хотите для перенаправления в этих классах, и создать с ними пользовательский HttpStack, подав его на Volley.newRequestQueue().

EDIT:

Предполагая, что очень длинные именные пользовательские реализации HttpStack являются вашими:

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

sRequestQueue = Volley.newRequestQueue(context, stack);