2010-01-19 2 views
3

Мне нужно изменить заголовки ответов в сообщении NSURLResponse. Это возможно?Mutable NSHTTPURLResponse или NSURLResponse

+0

Вы пытаетесь изменить заголовки, которые вы получаете с сервера ?! Вы имеете в виду NSURLRequest? – notnoop

+0

wait ... no .. я имею в виду NSURLResponse –

ответ

3

Вы можете прочитать их в NSDictionary, используя метод allHeaderFields.

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

Чтобы быть 100% гарантией безопасности, вы хотите, чтобы обернуть его

if ([response respondsToSelector:@selector(allHeaderFields)]) {... } 
+0

Не возвращает ли NSDictionary вместо NSMutableDictionary? –

+0

Да, это то, что есть в примере кода. Вот ссылка на класс http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSHTTPURLResponse_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHTTPURLResponse/allHeaderFields – shawnwall

+0

Я не знаю Посмотрите, как неизменный словарь поможет мне изменить ключи/значения. –

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 для Swizzle класса вне. Однако я не знаю, добавит ли она необходимую переменную экземпляра. Вы также можете использовать objc_setAssociatedObject и использовать все это в категории вместо этого, если вы можете поддерживать новый достаточно SDK.

1

У меня была аналогичная проблема. Я хотел изменить заголовки заголовков HTTP-ответа. Я нуждался в нем, потому что хотел предоставить кэшированный ответ url для UIWebView и хочу обмануть веб-представление, что ответ не истек (т. Е. Я хотел изменить свойство «Cache-Control» заголовка, но чтобы сохранить остальные заголовки). Мое решение состояло в том, чтобы использовать NSKeyedArchiver для кодирования исходного HTTP-ответа и перехвата сериализации с помощью делегата. В

-(id) archiver:(NSKeyedArchiver*) archiver willEncodeObject:(id) object 

проверить, является ли объект NSDictionary и если да, то я вернулся модифицированный словарь (т.е. с обновленным заголовком «Cache-Control»). Впоследствии я просто десериализовал сериализованный ответ, используя NSKeyedUnarchiver. Конечно, вы можете подключиться к unarchiver и изменить заголовки в своем делетете.

Обратите внимание, что в прошивке 5 Apple, добавила

-(id)initWithURL:(NSURL*) url statusCode:(NSInteger) statusCode HTTPVersion:(NSString*) HTTPVersion headerFields:(NSDictionary*) headerFields 

, который не в документации (документации ошибке), но в общественном API в NSHTTPURLResponse

0

Вы можете сделать это, и вы 'd need 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() 
Смежные вопросы