NSURLConnection/NSURLRequest поддержка gzip

Кто-нибудь знает, поддерживает ли NSURLConnection/NSURLRequest запросы gzip.

Если да, можете ли вы предоставить дополнительную информацию?


person mxg    schedule 21.04.2010    source источник
comment
Возможный дубликат Accept-Encoding: gzip на iOS   -  person jscs    schedule 01.11.2016
comment
@JoshCaswell, пожалуйста, проверьте разницу в датах. Он был задан через 5 лет после публикации этого вопроса.   -  person mxg    schedule 03.11.2016
comment
Дубликаты не всегда должны указывать на более позднюю дату. Я считаю, что ответ на другой вопрос немного полезнее, чем найденный здесь.   -  person jscs    schedule 03.11.2016


Ответы (2)


хотя это похоже не задокументировано, есть доказательства того, что NSURLConnection имеет прозрачную поддержку gzip. Это означает, что если сервер поддерживает кодировку gzip, а ваш запрос имеет заголовок Accept-Encoding, содержащий gzip*, сервер отправит ответ в формате gzip, который NSURLConnection будет автоматически декодирован.

* NSURLRequest может добавить этот заголовок по умолчанию. если нет, вы должны добавить его вручную следующим образом:

 [urlReq setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]
person ax.    schedule 21.04.2010
comment
1. я думаю, вам нужен NSMutableURLRequest для добавления заголовка 2. начиная с iOS 3.2 в качестве базового sdk заголовок accept-encoding, содержащий deflate и gzip, кажется, включается автоматически (очевидно, раньше этого не было). - person ; 08.12.2010
comment
Я только что провел тесты и увидел, что iPhone по умолчанию добавляет gzip и deflate. Кто-нибудь знает, всегда ли он поддерживался или с какой версии Apple начала включать Accept-Encoding по умолчанию? - person Dmitry; 11.02.2011
comment
Как насчет запросов кодирования gzip, отправляемых на сервер? stackoverflow.com/questions/6204066/ - person ma11hew28; 01.06.2011
comment
После получения данных нужно ли распаковывать полученные данные? - person Satyam; 07.02.2013
comment
@Satyamsvv [...]... сервер отправит сжатый ответ, который NSURLConnection автоматически декодирует. - person ax.; 07.02.2013
comment
Как я могу проверить, влияет ли это? - person Jared Egan; 30.09.2014
comment
Как получить данные ответа перед сжатием? На каком уровне происходит эта декомпрессия? CFNetwork? - person Beyond Chao; 05.01.2018
comment
@BeyondChao Вы имеете в виду данные ответа до **de**сжатия? - person ax.; 05.01.2018

NSURLRequest декодирует gzip в NSData; например, ответ сервера содержит "Content-Encoding" = gzip; NSData будет декодировать. Если вы не хотите автоматически декодировать его, добавьте код ниже. Это частный API.

//import CFNetwork.framework
extern CFStringRef kCFURLRequestDoNotDecodeData;
typedef const struct _CFURLRequest* CFURLRequestRef;
extern void _CFURLRequestSetProtocolProperty(CFURLRequestRef,CFStringRef,CFTypeRef);

//NSURLRequest init ...
//...
CFURLRequestRef requestRef = (CFURLRequestRef)[request performSelector:@selector(_CFURLRequest)];
_CFURLRequestSetProtocolProperty(requestRef,kCFURLRequestDoNotDecodeData,kCFBooleanTrue);
person liuyuning    schedule 23.05.2013
comment
Я подал запрос на bugreport.apple.com, чтобы этот или эквивалентный API был обнародован. openradar.appspot.com/radar?id=4931101243998208 - person John; 16.03.2016
comment
Это когда-нибудь решалось? Мне нужен способ загрузить поток без его автоматической распаковки. - person casolorz; 21.08.2018
comment
@casolorz Эта ошибка исправлена ​​​​в последней версии iOS, она хорошо работает на iOS8 и более поздних версиях. - person liuyuning; 09.09.2018
comment
@casolorz, можешь уточнить? ошибка здесь описана как отсутствующий API - так какой API заполняет пробел? как вы контролируете NSURLSession или запрос/ответ на использование gzip (или нет)? как вы указываете NSURLSession оставить ответ закодированным и передать его вам как есть? - person Motti Shneor; 29.05.2019
comment
@MottiShneor думаете, вы хотели спросить об этом кого-то другого? - person casolorz; 29.05.2019