SDWebImage и настройка пользовательских HTTP-заголовков? - программирование
Подтвердить что ты не робот

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;

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

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

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

4b9b3361

Ответ 1

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

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"];

Ответ 2

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

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

Ответ 3

Я использую обычную проверку подлинности и устанавливаю username и password в sharedDownloader:

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
downloader.username = @"username";
downloader.password = @"password";

Ответ 4

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

let imageDownloader = SDWebImageDownloader.shared()
imageDownloader.setValue("Username", forHTTPHeaderField: "X-Oauth-Username")

Ответ 5

Swift 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)
                    }
                }
            })