8

ヘッダーを処理するために常に自分でリダイレクトを処理する必要があるプロジェクトで Volley フレームワークを使用しています。

リダイレクトがどのように処理されるかは、メソッドとトランスポート層によって異なります。Volley コードを変更せずに、Volley のデフォルト (トランスポート層の自動選択) を使用したいと考えています。

有効な解決策は、常に OkHttp をトランスポート レイヤーとして使用することです ( Volley の問題と貢献 で説明されているように) が、追加のフレームワークを使用しない方法があるかどうかを知りたいです。

したがって、自動リダイレクト処理を無効にする「クリーンな」方法を探しています。

編集:

どの Android でどのバージョンを使用するかを自分で管理する必要がないように、OkHttp を使用することを好みますが、トランスポート層の動作を変更したい場合は、Itai Hanski が提供するソリューションが非常に適しています。

4

4 に答える 4

7

トランスポートとしてOkHttp を使用HttpStackする Volley の実装が最適なソリューションだと思います

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);
    }
}
于 2013-09-17T06:19:18.630 に答える
3

このソリューションには、別のフレームワークは必要ありません。

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);
于 2013-09-16T09:21:23.967 に答える