【问题标题】:Android Volley ImageLoader - How to use Basic HTTP Authorization?Android Volley ImageLoader - 如何使用基本 HTTP 授权?
【发布时间】:2013-06-04 13:54:43
【问题描述】:

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

我制定了以下方法:

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

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

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


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

【问题讨论】:

    标签: android android-volley


    【解决方案1】:

    我认为 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 行)。

    【讨论】:

    • 非常简洁的解决方案。 ;)
    • 作为 Android M 版本的一部分,从 sdk 中删除了 HttpResponse 类
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复。遗憾的是没有更简单的方法存在。我会按照您建议的方式进行 - 通过修改 ImageLoader 以使用自定义 ImageRequest 类(通过创建 ImageLoader 并将其传递给 ImageRequestFactory)。如果我是对的,匿名只是传递给 ImageRequest 的侦听器,而不是 ImageRequest 本身,所以这应该不是问题。
    • 有匿名ImageRequest调用onGetImageSuccess(cacheKey, response);在 onResponse 中(虽然我会直接把它放在 ImageRequest 中,甚至放在 Request 中。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2014-07-03
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2014-08-24
    • 2013-12-02
    相关资源
    最近更新 更多