Android Volley ImageLoader - 如何使用基本HTTP授权?

时间:2013-06-04 13:54:43

标签: android android-volley

我想使用Volley的NetworkImageView从我的REST API加载需要基本HTTP授权的图像。所以我需要为HTTP请求添加标题。

我已经采取了以下方法:

覆盖Request.getHeaders() - 如this question中所述。 这样会很好,但问题是ImageLoader已经new ImageRequest()硬编码,因此我无法将Request实现传递到ImageLoader,并且无法轻松继承调整(我需要重新实现的方法使用私有属性)。

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

使用自定义HttpClientStack - 如上所述here。 使用这种方法,我能够拦截HTTP通信并添加必要的标头。但我认为这不是正确的方法 - 我可以通过Volley(Gingerbread vs. HC和IC)自动选择HttpClient。


是否有一些简单的方法可以解决这个问题?

2 个答案:

答案 0 :(得分: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 source(第53行)。

答案 1 :(得分:6)

我也覆盖了getHeaders()。到目前为止,我还没有找到办法更轻松地做到这一点。

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

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

此外,我不知道如何根据Volley的结构轻松添加,对于Images,ImageRequests是由ImageLoader创建的。

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