8

我想使用 VolleyNetworkImageView从需要基本 HTTP 授权的 REST API 加载图像。所以我需要将标头添加到 HTTP 请求。

我制定了以下方法:

覆盖Request.getHeaders()- 如本问题所述。这很好,但问题是它ImageLoader已经new ImageRequest()硬编码,所以我不能将我的Request实现传递给ImageLoader它,也不能轻易继承和调整(我需要重新实现的方法使用私有属性)。

解决方案是修改 Volley 库本身(我想避免)。

使用自定义 HttpClientStack - 如此所述。使用这种方法,我将能够拦截 HTTP 通信并添加必要的标头。但我认为这不是正确的做法——我会放弃 Volley 对 HttpClient 的自动选择(姜饼与 HC 和 IC)。


有没有更简单的方法来实现我所缺少的?

4

2 回答 2

8

我认为 HTTP 堆栈是要走的路。如果您根据 SDK 版本进行覆盖,则不会丢失自动 HttpClient 选择,就像 Volley 所做的那样。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
        HurlStack stack = new HurlStack() {
            @Override
            public HttpResponse performRequest(Request<?> request, Map<String, String> headers)
                throws IOException, AuthFailureError {

                headers.putAll(MyApp.getAuthParams());

                return super.performRequest(request, headers);
            }
        };

        requestQueue = Volley.newRequestQueue(getApplicationContext(), stack);

    } else {
        HttpClientStack stack = new HttpClientStack(AndroidHttpClient.newInstance("volley/0")) {
            @Override
            public HttpResponse performRequest(Request<?> request, Map<String, String> headers)
                throws IOException, AuthFailureError {

                headers.putAll(MyApp.getAuthParams());

                return super.performRequest(request, headers);
            }
        };

        requestQueue = Volley.newRequestQueue(getApplicationContext(), stack);
    }

参见Volley 源代码(第 53 行)。

于 2013-07-25T14:20:50.307 回答
6

我也覆盖getHeaders()了。到目前为止,我还没有找到更容易做到这一点的方法。

请参阅此示例https://github.com/njzk2/VolleyTwitter/blob/master/src/com/njzk2/twitterbrowser/TokenRequest.java的覆盖请求以包含授权标头。

从 Volley 代码中,如果不是通过覆盖 Request 对象,我看不到任何添加自定义标头的方法。

此外,鉴于 Volley 的结构,我看不到如何轻松添加它,至于图像,ImageRequests 是由 ImageLoader 创建的。

如果我要修改 Volley 以允许这样做,我将可以在 ImageLoader 中使用自定义类扩展 ImageRequest。不过,ImageLoader 中的匿名 ImageRequest 类使它有点复杂。

于 2013-06-04T13:57:55.363 回答