3

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

4

4 回答 4

9

我刚刚和一个朋友谈论这个。我的建议是写一个 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-02-03T19:18:23.593 回答
3

您可以使用该方法将它们读入 NSDictionary allHeaderFields

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSDictionary *httpResponseHeaderFields = [httpResponse
allHeaderFields];

为了 100% 安全,您需要将其包裹起来

if ([response respondsToSelector:@selector(allHeaderFields)]) {... }
于 2010-01-19T20:12:44.583 回答
1

我有一个类似的问题。我想修改 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 中

于 2012-02-10T11:20:57.700 回答
-2

你可以这样做,而且你不需要NSHTTPURLResponseNSURLResponse因为在 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()
于 2016-05-25T14:50:43.997 回答