Changer la Politique de redirection du cadre de Volley

j'utilise le cadre Volley dans un projet où j'ai toujours besoin de gérer les redirections moi-même pour gérer les en-têtes.

la façon dont les redirections sont gérées dépend en ce moment de la méthode et de la couche de transport. Je voudrais utiliser les valeurs par défaut de Volley (sélection automatique de la couche transport) sans changer aucun code de Volley.

une solution valable consiste à toujours utiliser OkHttp comme couche de transport (comme indiqué dans ). contribution for Volley ), mais je voudrais savoir s'il y a une façon sans un cadre supplémentaire.

donc je cherche un moyen" propre " pour désactiver la gestion automatique de redirection.

Edit:

je préfère utiliser OkHttp de sorte que je n'ai pas à gérer quelle version à utiliser sur ce que Android moi-même, mais la solution fournie par Itai Hanski est très bon à, quand vous voulez changer la comportement de la couche transport.

6
demandé sur Community 2013-09-13 16:13:55

3 réponses

je pense qu'Un HttpStack la mise en œuvre de Volley-ball qui utilise OkHttp que son transport est la meilleure solution", 151970920"

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 class:

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

mise à Jour: si vous utilisez la nouvelle version de la pile okhttp, utilisez

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);
    }
}
7
répondu LOG_TAG 2015-03-26 09:14:26

si vous ne vous souciez pas de vieux APIs (< 9) et vous voulez juste volley arrêter de suivre redirections vous pouvez faire

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;
    }
});
15
répondu Denis Kniazhev 2017-07-17 11:08:18

Cette solution ne nécessite pas un autre cadre:

Volley utilise AndroidHTTPClient ou Apache (si le niveau SDK est 8 et inférieur) par défaut. Vous pouvez outrepasser / hériter les changements que vous voulez pour la redirection dans ces classes et créer une coutume HttpStack avec eux, en l'alimentant au Volley.newRequestQueue() .

EDIT:

en supposant que la très longue coutume nommée HttpStack les implémentations sont les vôtres:

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

sRequestQueue = Volley.newRequestQueue(context, stack);
3
répondu Itai Hanski 2014-03-10 11:03:32