我想使用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。
是否有一些简单的方法可以解决这个问题?
答案 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类使它有点复杂。