我需要修改 NSURLResponse 中的响应标头。这可能吗?
4 回答
我刚刚和一个朋友谈论这个。我的建议是写一个 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,您也可以在一个类别中使用和填充所有这些。
您可以使用该方法将它们读入 NSDictionary allHeaderFields
。
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *httpResponseHeaderFields = [httpResponse
allHeaderFields];
为了 100% 安全,您需要将其包裹起来
if ([response respondsToSelector:@selector(allHeaderFields)]) {... }
我有一个类似的问题。我想修改 http url 响应的头文件。我之所以需要它是因为想为 UIWebView 提供缓存的 url 响应,并想欺骗 Web 视图以使响应未过期(即我想更改标头的“Cache-Control”属性但保留其余的标头)。我的解决方案是使用 NSKeyedArchiver 对原始 http 响应进行编码,并使用委托拦截序列化。在
-(id) archiver:(NSKeyedArchiver*) archiver willEncodeObject:(id) object
我检查对象是否为 NSDictionary,如果是,我返回修改后的字典(即更新的“Cache-Control”标头)。之后我只是使用 NSKeyedUnarchiver 反序列化了序列化的响应。当然,您可以连接到 unarchiver 并修改其委托中的标头。
请注意,在 iOS 5 Apple 已添加
-(id)initWithURL:(NSURL*) url statusCode:(NSInteger) statusCode HTTPVersion:(NSString*) HTTPVersion headerFields:(NSDictionary*) headerFields
这不在文档中(文档错误),但在 NSHTTPURLResponse 的公共 API 中
你可以这样做,而且你不需要NSHTTPURLResponse
,NSURLResponse
因为在 Swift 中,NSURLResponse
可以与许多协议一起使用,而不仅仅是http
,例如ftp
,data:
或https
. 因此,您可以调用它来获取元数据信息,例如预期的内容类型、mime 类型和文本编码,同时NSHTTURLResponse
负责处理 HTTP 协议响应。因此,它是操纵标题的人。
这是一个小代码,用于操作Server
响应中的标题键,并打印更改前后的值。
let url = "https://www.google.com"
let request = NSMutableURLRequest(URL: NSURL(string: url)!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if let response = response {
let nsHTTPURLResponse = response as! NSHTTPURLResponse
var headers = nsHTTPURLResponse.allHeaderFields
print ("The value of the Server header before is: \(headers["Server"]!)")
headers["Server"] = "whatever goes here"
print ("The value of the Server header after is: \(headers["Server"]!)")
}
})
task.resume()