Мне нужно изменить заголовки ответов в сообщении NSURLResponse. Это возможно?Mutable NSHTTPURLResponse или NSURLResponse
ответ
Вы можете прочитать их в NSDictionary, используя метод allHeaderFields
.
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *httpResponseHeaderFields = [httpResponse
allHeaderFields];
Чтобы быть 100% гарантией безопасности, вы хотите, чтобы обернуть его
if ([response respondsToSelector:@selector(allHeaderFields)]) {... }
Не возвращает ли NSDictionary вместо NSMutableDictionary? –
Да, это то, что есть в примере кода. Вот ссылка на класс http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSHTTPURLResponse_Class/Reference/Reference.html#//apple_ref/occ/instm/NSHTTPURLResponse/allHeaderFields – shawnwall
Я не знаю Посмотрите, как неизменный словарь поможет мне изменить ключи/значения. –
Я только что говорил об этом с другом. Мое предложение было бы написать подкласс 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.
У меня была аналогичная проблема. Я хотел изменить заголовки заголовков 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
Вы можете сделать это, и вы '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()
- 1. NSHTTPURLResponse становится NSURLResponse
- 2. NSHTTPURLResponse
- 3. NSURLResponse возвращает nil?
- 4. Карта Ключи -Mutable или Non-Mutable
- 5. Получить печенье из NSHTTPURLResponse
- 6. Как установить statusCode в NSURLResponse
- 7. Mutable или Immutable Set?
- 8. Mutable или неизменяемые затворы
- 9. Swift - опущенное NSURLResponse к NSHTTPURLResponse для того, чтобы получить код ответа
- 10. Mutable variable vs Mutable collection
- 11. Получить несколько заголовков Set-Cookie из NSHTTPURLResponse
- 12. Извлечь данные из NSURLResponse
- 13. Почему isKindOfClass: [NSHTTPURLResponse self] вместо isKindOfClass: [класс NSHTTPURLResponse]?
- 14. NSURLResponse, не отображающий местоположение в заголовке
- 15. Предоставить HTTPVersion для NSHTTPURLResponse
- 16. Crash in - [NSURLResponse allHeaderFields]
- 17. Использование NSURLResponse (webViewHack)
- 18. NSURL и NSURLResponse синтаксис
- 19. альтернатива expectContentLength NSURLResponse
- 20. NSURLResponse expectedContentLength -1
- 21. Как использовать NSURLResponse как segue trigger swift
- 22. Почему мой NSURLResponse пропускает память при архивировании?
- 23. Установите сертификат NSHTTPURLResponse в iPhone
- 24. Константы/Переменные и Non-Mutable/Mutable
- 25. NSHTTPURLResponse allHeaderFields чувствительность к регистру
- 26. Получение заголовка «Местоположение» от NSHTTPURLResponse
- 27. NSURLResponse kCFURLErrorNotConnectedToInternet по мобильной связи
- 28. NSURLResponse не всегда принимает данные
- 29. Коллекции Mutable?
- 30. Mutable android.os.Environment.DIRECTORY_WHATEVER?
Вы пытаетесь изменить заголовки, которые вы получаете с сервера ?! Вы имеете в виду NSURLRequest? – notnoop
wait ... no .. я имею в виду NSURLResponse –