我需要修改NSURLResponse中的响应头。这个是可能的吗?
发布于 2010-02-04 03:18:24
我刚和一个朋友谈到这件事。我的建议是编写一个NSURLResponse的子类。大致是这样的:
@interface MyHTTPURLResponse : NSURLResponse { NSDictionary *myDict; }
- (void)setAllHeaderFields:(NSDictionary *)dictionary;
@end
@implementation MyHTTPURLResponse
- (NSDictionary *)allHeaderFields { return myDict ?: [super allHeaderFields]; }
- (void)setAllHeaderFields:(NSDictionary *)dict { if (myDict != dict) { [myDict release]; myDict = [dict retain]; } }
@end如果您正在处理一个不是自己创建的对象,您可以尝试使用object_setClass来清除这个类。然而,我不知道这是否会添加必要的实例变量。如果你能支持一个新的足够的objc_setAssociatedObject,你也可以使用SDK,并将所有这些都放在一个类别中。
发布于 2010-01-20 04:12:45
您可以使用allHeaderFields方法将它们读取到NSDictionary中。
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *httpResponseHeaderFields = [httpResponse
allHeaderFields];为了保证100%的安全,你需要用
if ([response respondsToSelector:@selector(allHeaderFields)]) {... }发布于 2012-02-10 19:20:58
我也遇到过类似的问题。我想修改http url响应的头文件。我之所以需要它,是因为我想向UIWebView提供缓存的url响应,并想愚弄web视图,使其认为响应没有过期(即,我想更改标题的“缓存控制”属性,但保留其余的标题)。我的解决方案是使用NSKeyedArchiver对原始的http响应进行编码,并使用委托截获序列化。在……里面
-(id) archiver:(NSKeyedArchiver*) archiver willEncodeObject:(id) object我检查对象是否为缓存,如果是,我返回修改过的字典(即带有更新的“NSDictionary -NSDictionary”头)。之后,我只使用NSKeyedUnarchiver反序列化了序列化后的响应。当然,您可以挂接到解压程序并修改其委托中的头文件。
请注意,在iOS 5中,苹果添加了
-(id)initWithURL:(NSURL*) url statusCode:(NSInteger) statusCode HTTPVersion:(NSString*) HTTPVersion headerFields:(NSDictionary*) headerFields它不在文档(文档错误)中,但在NSHTTPURLResponse的公共API中。
https://stackoverflow.com/questions/2096651
复制相似问题