SDWebImage和设置自定义HTTP头部?

23

我刚刚将缓存图像的代码从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 headers。但是我使用UIImageView+WebCache.h时,并没有看到设置headers的选项。在我的代码中,我调用了

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

有人可以告诉我如何设置HTTP头吗?

6个回答

47

我遇到了同样的问题,我尝试做出:

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

我会试一下。谢谢你的回复!似乎没有很多开发者需要那个功能。 - rockstarberlin
1
您应该得到更多的赞。这个答案是100%正确的,原始代码是违反直觉的。 - PakitoV
但是你如何设置密码? - sudo
@9000 是什么类型的密码?HTTP 密码?还是普通的头部?如果是后者,您可以设置多个头部,一个用于用户名,另一个用于密码(您必须两次调用 setValue:forHTTPHeaderFiled)。 - Néstor

4

Swift版本

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

1
这是完美的答案。 - Umair_UAS

4

我知道这已经很老了,但我仍然想分享一下对我有用的内容。我需要为头部设置登录令牌值logintoken。所以,这段代码实现了我想要的效果 -

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

3

我正在使用基本认证,并在sharedDownloader上设置usernamepassword

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

2

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

1

从SDWebImage 5开始,需要使用以下代码片段。

    func configureSDWebImageHeader(){
    let requestModifier = SDWebImageDownloaderRequestModifier { (request) -> URLRequest? in
        var mutableRequest = request
        // Used Your Header Keys
        mutableRequest.setValue("", forHTTPHeaderField: KeyConstant.USERID)
        mutableRequest.setValue("", forHTTPHeaderField: KeyConstant.AUTH_KEY)
        return mutableRequest
    };
    SDWebImageDownloader.shared.requestModifier = requestModifier
}

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