使用Glide和OkHttp如何获取HTTP响应头

3

我需要从图片中获取http响应头。如何为来自Glide的每个请求创建拦截器?是否需要创建一个Glide模块?

2个回答

5
首先,您需要使用自定义的GlideModule来集成Glide和OkHttp,而不是使用默认的模块。请参考这个例子了解如何实现。
然后,您需要编写一个OkHttp拦截器来拦截响应信息并获取响应头。请参考OkHttp Logging Interceptor代码,您将了解如何拦截响应并获取响应头。
您需要将该拦截器设置到OkHttpClient中(通常是一个单例实例):
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(yourInterceptor).build();

那个 OkHttpClient 实例需要传递给您自定义的 GlideModule 实现的 registerComponents() 回调函数:
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory( okHttpClient ));

很高兴能帮助 :) - Bob
5
“this example”中的链接已经失效。 - Alt-Cat

3
通过拦截您的glide响应,您可以获取响应头。
@GlideModule
class MyGlideModule : AppGlideModule() {
      override fun applyOptions(context: Context?, builder: GlideBuilder?) {
      }

      override fun registerComponents(context: Context?, glide: Glide?, 
        registry: Registry?) {
            super.registerComponents(context, glide, registry)
            val httpClient = OkHttpClient.Builder()
            httpClient.addInterceptor({ chain: Interceptor.Chain? ->
                val response = chain?.proceed(chain.request())
                // for get specific header  
                val header = response?.header("specific header")
                // for get all headers 
                val headers = response?.headers()

                response
            })

            registry?.replace(GlideUrl::class.java, InputStream::class.java, 
            OkHttpUrlLoader.Factory(httpClient.build()))
        }
    }

如果您找不到类似OkHttpUrlLoader的类,则可以在此处找到它 这里


2
实际上,您可以添加 此链接 以支持 OkHttpUrlLoader。 - grrigore
我很困惑这个如何在GlideApp.load()调用中使用?不同的URL可能会生成不同的响应头。 - chitgoks

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