SDWebImage и настройка пользовательских заголовков HTTP?

Я только что изменил свой код для кэширования изображений с EGOImageCache на SDWebView. К сожалению, я не знаю, как установить пользовательские заголовки HTTP, так как мне нужно отправить аутентификацию, чтобы иметь возможность получать изображения. Это было легко сделать с помощью EGOImageCache, поскольку я расширил NSURLRequest в нужном месте. Но я не знаю, как это сделать с помощью SDWebView.framework. Я вижу заголовки и нашел методы в SDWebImageDownloader.h, содержащие

    /**
 * Set a value for a HTTP header to be appended to each download HTTP request.
 *
 * @param value The value for the header field. Use `nil` value to remove the header.
 * @param field The name of the header field to set.
 */
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

/**
 * Returns the value of the specified HTTP header field.
 *
 * @return The value associated with the header field field, or `nil` if there is no corresponding header field.
 */
- (NSString *)valueForHTTPHeaderField:(NSString *)field;

Кажется, что библиотека поддерживает заголовки HTTP. Но поскольку я использую UIImageView+WebCache.h, я не вижу возможности для установки заголовков. В моем коде я звоню

[self.imageView setImageWithURL:[NSURL URLWithString:themeImageURL] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

Может ли кто-нибудь сказать мне, как установить заголовки HTTP?


person rockstarberlin    schedule 28.04.2013    source источник


Ответы (5)


У меня была такая же проблема, и я попытался сделать:

SDWebImageDownloader *manager = [SDWebImageDownloader sharedDownloader];
[manager setValue:username forHTTPHeaderField:@"X-Oauth-Username"];

Но заголовок не был отправлен. После некоторых попыток я столкнулся с проблемой: SDWebImageDownloader в sharedDownloader создает новый экземпляр SDWebImageDownloader, поэтому, когда вы помещаете заголовок в этот экземпляр, экземпляр, который действительно загружает изображение, не имеет заголовка.

Я решил сделать это:

SDWebImageDownloader *manager = [SDWebImageManager sharedManager].imageDownloader;
[manager setValue:username forHTTPHeaderField:@"X-Oauth-Username"];
person Néstor    schedule 23.05.2013
comment
я попробую это. Спасибо за ваш ответ! кажется, что не многим разработчикам нужна эта функция. - person rockstarberlin; 27.05.2013
comment
Вы, сэр, заслуживаете большего количества голосов. Этот ответ на 100% правильный, а исходный код нелогичен. - person PakitoV; 23.04.2014
comment
Но как установить пароль? - person sudo; 06.11.2014
comment
@9000 Какой тип пароля? HTTP-пароль? Или обычный заголовок? В последнем случае вы можете установить несколько заголовков, один для имени пользователя и один для пароля (вы должны дважды вызвать setValue: forHTTPHeaderFiled). - person Néstor; 06.11.2014

Я знаю, что он довольно старый, но не могу не поделиться тем, что сработало для меня. Мне нужно было установить значение токена входа в систему для заголовка logintoken. Итак, этот фрагмент кода сделал то, что я хотел -

NSString *loginToken = // Some method to fetch login token    
[SDWebImageDownloader.sharedDownloader setValue:loginToken forHTTPHeaderField:@"logintoken"];
person Munim Dibosh    schedule 30.07.2015

Я использую обычную аутентификацию, и установка username и password на sharedDownloader помогла:

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
downloader.username = @"username";
downloader.password = @"password";
person Davor Zlotrg    schedule 27.11.2016

Быстрая версия

let imageDownloader = SDWebImageDownloader.shared()
imageDownloader.setValue("Username", forHTTPHeaderField: "X-Oauth-Username")
person Manuel Escrig    schedule 13.11.2017
comment
Это идеальный ответ. - person Umair_UAS; 03.09.2019

Свифт 4.1

let manager = SDWebImageManager.shared().imageDownloader
manager?.setValue("oAuthToken",forHTTPHeaderField: "AuthHeaderName")
manager?.downloadImage(with: imageURL, options: SDWebImageDownloaderOptions.useNSURLCache, progress:
                { (receivedSize, expectedSize , url) in
                // progression tracking code
            }, completed: { (image,data , error,finished) in
                if error == nil && image != nil {
                    // here the downloaded image is cached, now you need to set it to the imageView
                    DispatchQueue.main.async {
                        imageView.image = image
                        self.maskCircle(anyImage: image!)
                    }
                } else {
                    // handle the failure
                    DispatchQueue.main.async {
                        let defaultImage = UIImage(named: "defaultImage")
                        imageView.image = defImage
                        self.maskCircle(anyImage: defImage)
                    }
                }
            })
person Manikandan    schedule 21.08.2018