首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变NSHTTPURLResponse或NSURLResponse

可变NSHTTPURLResponse或NSURLResponse
EN

Stack Overflow用户
提问于 2010-01-20 04:01:03
回答 4查看 6.6K关注 0票数 3

我需要修改NSURLResponse中的响应头。这个是可能的吗?

EN

回答 4

Stack Overflow用户

发布于 2010-02-04 03:18:24

我刚和一个朋友谈到这件事。我的建议是编写一个NSURLResponse的子类。大致是这样的:

代码语言:javascript
复制
@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,并将所有这些都放在一个类别中。

票数 9
EN

Stack Overflow用户

发布于 2010-01-20 04:12:45

您可以使用allHeaderFields方法将它们读取到NSDictionary中。

代码语言:javascript
复制
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSDictionary *httpResponseHeaderFields = [httpResponse
allHeaderFields];

为了保证100%的安全,你需要用

代码语言:javascript
复制
if ([response respondsToSelector:@selector(allHeaderFields)]) {... }
票数 3
EN

Stack Overflow用户

发布于 2012-02-10 19:20:58

我也遇到过类似的问题。我想修改http url响应的头文件。我之所以需要它,是因为我想向UIWebView提供缓存的url响应,并想愚弄web视图,使其认为响应没有过期(即,我想更改标题的“缓存控制”属性,但保留其余的标题)。我的解决方案是使用NSKeyedArchiver对原始的http响应进行编码,并使用委托截获序列化。在……里面

代码语言:javascript
复制
-(id) archiver:(NSKeyedArchiver*) archiver willEncodeObject:(id) object

我检查对象是否为缓存,如果是,我返回修改过的字典(即带有更新的“NSDictionary -NSDictionary”头)。之后,我只使用NSKeyedUnarchiver反序列化了序列化后的响应。当然,您可以挂接到解压程序并修改其委托中的头文件。

请注意,在iOS 5中,苹果添加了

代码语言:javascript
复制
-(id)initWithURL:(NSURL*) url statusCode:(NSInteger) statusCode HTTPVersion:(NSString*) HTTPVersion headerFields:(NSDictionary*) headerFields

它不在文档(文档错误)中,但在NSHTTPURLResponse的公共API中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2096651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档