【问题标题】:Glide - adding header to requestGlide - 向请求添加标头
【发布时间】:2015-03-22 07:01:36
【问题描述】:

有没有一种方法可以在下载图像时添加自定义标头来请求? 我可以在 Glide 中使用 volley 或 okhttp。

我尝试在 okhttpclient 中向 cookiemanager 添加 cookie,但没有帮助。

在 Glide 中是否有调试请求响应的方法?

【问题讨论】:

    标签: android request android-volley okhttp android-glide


    【解决方案1】:

    由于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)....;
    

    【讨论】:

    • 这很漂亮。谢谢!
    • 太好了,我需要这个来在请求的标头中设置 AccessToken。谢谢!
    • 我仍然遇到这个问题 - com.bumptech.glide.load.HttpException: Unauthorized
    • 我的应用程序崩溃了.. java.lang.IllegalArgumentException: 不能为空或空,指出他的行 .build()) ...
    • 这个脚本中的“computeExpensiveAuthHeader()”方法是做什么的?
    【解决方案2】:

    试试这个:

    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: 不能为空或空,指出他的行 .build()) ...
    【解决方案3】:

    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)
    

    【讨论】:

      【解决方案4】:

      如果你不能让 Glide 去做,你可以使用OkHttp Interceptors。

      【讨论】:

        【解决方案5】:

        拦截器听起来是个不错的选择。您可以使用 Glide 将您自己的 OkHttp 客户端实例传递给 OkHttpUrlLoader.Factory 和 register 工厂。

        如果您想要更多控制权,您也可以简单地 fork OkHttp ModelLoader 和 DataFetcher,注册您的 fork ModelLoader,并为每个请求直接访问 OkHttp 客户端。

        【讨论】:

          【解决方案6】:
          // 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://....")....;
          

          【讨论】:

          • 在使用之前查看问题中的 cmets:github.com/bumptech/glide/issues/471。特别是,替换 String -> InputStream 加载器将删除 uri 和文件路径字符串的默认处理。请考虑使用自定义模型类型(String 除外)。
          • 我该怎么做?你能把正确的答案放在这里吗?
          • 查看关于这个问题的评论,里面有例子的链接
          • 如何在新版本 4.6.1 中做到这一点?
          【解决方案7】:

          我想这已经很晚了,但我把它放在这里是为了给其他面临这个问题的人做笔记。这是我的代码示例(这是 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

          【讨论】:

          【解决方案8】:

          请阅读此主题:https://github.com/bumptech/glide/issues/198

          似乎它将在即将发布的版本 (4.0) 中实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-30
            • 2016-04-10
            • 1970-01-01
            • 1970-01-01
            • 2013-10-28
            • 1970-01-01
            • 2017-12-27
            • 2012-11-15
            相关资源
            最近更新 更多