有没有一种方法可以在下载图像时添加自定义标头来请求?我可以在 Glide 中使用 volley 或 okhttp。
我尝试在 okhttpclient 中向 cookiemanager 添加一个 cookie,但没有帮助。
在 Glide 中是否有调试请求响应的方法?
有没有一种方法可以在下载图像时添加自定义标头来请求?我可以在 Glide 中使用 volley 或 okhttp。
我尝试在 okhttpclient 中向 cookiemanager 添加一个 cookie,但没有帮助。
在 Glide 中是否有调试请求响应的方法?
从3.6.0开始,可以为每个请求设置自定义标头:
GlideUrl glideUrl = new GlideUrl("url", new LazyHeaders.Builder()
.addHeader("key1", "value")
.addHeader("key2", new LazyHeaderFactory() {
@Override
public String buildHeader() {
String expensiveAuthHeader = computeExpensiveAuthHeader();
return expensiveAuthHeader;
}
})
.build());
Glide....load(glideUrl)....;
尝试这个:
ImageView imgThumb = itemView.findViewById(R.id.image_thumb);
GlideUrl url = new GlideUrl("https://your-url.com", new LazyHeaders.Builder()
.addHeader("User-Agent", "your-user-agent")
.build());
RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(mContext).load(glideUrl)
.transition(withCrossFade())
.thumbnail(0.5f)
.apply(options)
.into(imgThumb);
滑翔参考是:
implementation 'com.github.bumptech.glide:glide:4.6.1'
Kotlin + Glide 4.10.0
val token = "..."
val url = https://url.to.your.image
val glideUrl = GlideUrl(url) { mapOf(Pair("Authorization", "Bearer $token")) }
Glide.with(context)
.load(glideUrl)
.into(imageView)
如果你不能让 Glide 来做,你可以使用OkHttp Interceptors。
拦截器听起来是个不错的选择。您可以将自己的 OkHttp 客户端实例传递给OkHttpUrlLoader.Factory并使用 Glide注册Factory。
如果你想要更多的控制权,你也可以简单地 fork OkHttp ModelLoader和DataFetcher,注册你的 fork 模型加载器,并为每个请求直接访问 OkHttp 客户端。
// make sure it's registered in AndroidManifest.xml as described at https://github.com/bumptech/glide/wiki/Configuration#including-a-glidemodule
public class GlideSetup implements GlideModule {
@Override public void applyOptions(Context context, GlideBuilder builder) { /* no costumization */ }
@Override public void registerComponents(Context context, Glide glide) {
glide.register(String.class, InputStream.class, new HeaderedLoader.Factory());
}
private static class HeaderedLoader extends BaseGlideUrlLoader<String> {
public static final Headers HEADERS = new LazyHeaders.Builder()
.addHeader("User-Agent", USER_AGENT)
.addHeader("App-Agent", APP_AGENT)
.build();
public HeaderedLoader(Context context) {
super(context);
}
@Override protected String getUrl(String model, int width, int height) {
return model;
}
@Override protected Headers getHeaders(String model, int width, int height) {
return HEADERS;
}
public static class Factory implements ModelLoaderFactory<String, InputStream> {
@Override public StreamModelLoader<String> build(Context context, GenericLoaderFactory factories) {
return new HeaderedLoader(context);
}
@Override public void teardown() { /* nothing to free */ }
}
}
}
接着
....load("http://....")....;
这已经晚了,我想,但我把它放在这里是为了给其他面临这个问题的人做笔记。这是我的代码示例(这是针对 Glide v4):
BaseGlideUrlLoader 模块:
private static class HeaderedLoader extends BaseGlideUrlLoader<String> {
public static final Headers HEADERS = new LazyHeaders.Builder()
.addHeader("Referer", UserSingleton.getInstance().getBaseUrl())
.build();
public HeaderedLoader(ModelLoader<GlideUrl, InputStream> concreteLoader) {
super(concreteLoader);
}
@Override public boolean handles(@NonNull String model) {
return true;
}
@Override protected String getUrl(String model, int width, int height, Options options) {
return model;
}
@Override protected Headers getHeaders(String model, int width, int height, Options options) {
return HEADERS;
}
public static class Factory implements ModelLoaderFactory<String, InputStream> {
@Override public @NonNull ModelLoader<String, InputStream> build(
@NonNull MultiModelLoaderFactory multiFactory) {
return new HeaderedLoader(multiFactory.build(GlideUrl.class, InputStream.class));
}
@Override public void teardown() { /* nothing to free */ }
}
}
在 AppGlideModule 中添加 HeaderLoader 类。
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);
registry.replace(GlideUrl.class, InputStream.class,
new OkHttpUrlLoader.Factory(CustomOkHttpsClient.getTrustedOkHttpClient()
));
// override default loader with one that attaches headers
registry.replace(String.class, InputStream.class, new HeaderedLoader.Factory());
}
我的解决方案基于此处提供的链接 https://github.com/TWiStErRob/glide-support/commit/b357427363c28a82495097ec862b82acdf3b4357
原始问题在这里讨论https://github.com/bumptech/glide/issues/471
感谢@TWiStErRob
请阅读此主题:https ://github.com/bumptech/glide/issues/198
似乎它将在即将发布的版本(4.0)中实施。