web-dev-qa-db-ja.com

グライド-リクエストにヘッダーを追加する

画像がダウンロードされたときにリクエストするカスタムヘッダーを追加する方法はありますか? Glideでvolleyまたはokhttpを使用できます。

Okhttpclientのcookiemanagerにcookieを追加しようとしましたが、役に立ちませんでした。 Glideでリクエストの応答をデバッグする方法はありますか?

よろしくトム

22
tomi

.6. 以降、リクエストごとにカスタムヘッダーを設定できます。

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)....;
69
TWiStErRob

Glideがそれを実行できない場合は、 OkHttp Interceptors を使用できます。

4
Jesse Wilson

これを試して:

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'
4
educoutinho

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)
2
ArcDexx

インターセプターは素晴らしい選択のように聞こえます。 OkHttpクライアントの独自のインスタンスを OkHttpUrlLoader.Factory および register Glideのファクトリーに渡すことができます。

さらに制御が必要な場合は、単純に OkHttp ModelLoaderDataFetcher をフォークし、フォークしたModelLoaderを登録して、すべてのリクエストに対してOkHttpクライアントに直接アクセスできます。

1
Sam Judd
// 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
Morteza Rastgoo

このスレッドをお読みください: https://github.com/bumptech/glide/issues/198

次のリリース(4.0)で実装されるようです。

0
Naphtali Gilead

これは遅いと思いますが、問題に直面している他の人のためのメモとしてここに置いておきます。これが私のコードサンプルです(これは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に感謝

0
YazidEF