Glide - 添加请求头

37

如何在下载图片时添加自定义请求头?我可以在Glide中使用Volley或OkHttp。

我尝试在OkHttpClient的CookieManager中添加cookie,但没有起作用。

是否有一种方法可以在Glide中调试请求响应?

8个回答

92

自从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)....;

3
很漂亮。谢谢! - Mauker
太好了,我需要这个来设置请求头中的AccessToken。谢谢! - Guillaume Ilitch Tchaïkovsky
这个脚本中的“computeExpensiveAuthHeader()”方法是做什么的? - Arash Afsharpour
1
@ArashAfsharpour 这是你定义的代码。LazyHeaders 的示例演示了如何在后台线程上计算昂贵的标头,因为 Glide 加载通常在主线程上启动,访问磁盘/网络会阻塞 UI。如果您拥有所有所需的信息并且可以快速访问内存,则不需要 LazyHeaderFactory - TWiStErRob
@TWiStErRob 是的,Glide 4.13.2。但我没有使用LazyHeaderFactorybuildHeader() - antaki93
显示剩余4条评论

17

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)

16

试试这个:

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);

Glide的参考文献是:

implementation 'com.github.bumptech.glide:glide:4.6.1'

我的应用程序崩溃了...java.lang.IllegalArgumentException: Must not be null or empty指向行.build())... - Android Geek

4

3
这可能有点晚了,但我把它放在这里供其他遇到此问题的人做参考。以下是我的代码示例(适用于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。

欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:添加链接周围的上下文,以便您的同行用户了解它是什么以及为什么存在,然后引用您链接到的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除 - David Buck

1
// 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://....")....;

1
在使用之前,请查看此问题中的注释:https://github.com/bumptech/glide/issues/471。特别是,替换String -> InputStream加载器将删除URI和文件路径字符串的默认处理。相反,考虑使用自定义模型类型(而不是String)。 - Sam Judd
我该怎么做?你能把正确答案放在这里吗? - Morteza Rastgoo
请查看问题评论,其中包含示例链接。 - Sam Judd
如何在新版本4.6.1中实现? - NickUnuchek

1
拦截器听起来像是个不错的选择。您可以将自己的OkHttp客户端实例传递给OkHttpUrlLoader.Factory,并使用register将工厂注册到Glide中。
如果您想要更多的控制权,还可以简单地分叉OkHttp ModelLoaderDataFetcher,注册您分叉的ModelLoader,并直接访问每个请求的OkHttp客户端。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接