2010-04-21 16 views
34

Est-ce que quelqu'un sait si NSURLConnection/NSURLRequest prend en charge les requêtes gzip.NSURLConnection/NSURLRequest support gzip

Si oui, pouvez-vous fournir plus d'informations?

+0

double possible de [Accept-Encoding: gzip sur iOS] (http://stackoverflow.com/questions/25333857/accept-encoding-gzip-on-ios) –

+0

@JoshCaswell, s'il vous plaît vérifier la différence de date . Il a été demandé 5 ans après que cette question a été postée. – mxg

+0

[Les doublons ne doivent pas toujours pointer vers la date ultérieure] (http://meta.stackexchange.com/a/147651/159251). Je crois que la réponse à l'autre question est un peu plus utile que celles trouvées ici. –

Répondre

63

bien qu'il does not seem to be documented, there is evidence que NSURLConnectionne ont support gzip transparent. ce qui signifie que si le serveur prend en charge le codage gzip et que votre requête contient un en-tête Accept-Encoding contenant gzip *, le serveur enverra une réponse gzippée, qui sera automatiquement décodée par NSURLConnection.

* NSURLRequest peut ajouter cet en-tête par défaut. sinon, vous devez l'ajouter manuellement comme ceci:

[urlReq setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"] 
+8

1. Je pense que vous avez besoin d'un NSMutableURLRequest pour ajouter un en-tête 2. à partir de "iOS 3.2" comme base sdk, l'en-tête accept-encoding contenant deflate et gzip semble être automatiquement inclus (apparemment pas utilisé). – hop

+6

Je viens de faire des tests et j'ai vu que l'iPhone ajoute gzip et deflate par défaut. Est-ce que quelqu'un sait s'il a toujours été supporté ou depuis quelle version Apple a commencé à accepter Accept-Encoding par défaut? – Dmitry

+3

Qu'en est-il des demandes de codage gzip envoyées au serveur? http://stackoverflow.com/questions/6204066/how-to-gzip-an-nsurlconnection-request – ma11hew28

2

NSURLRequest décodent gzip à NSData; comme la réponse du serveur contient "Content-Encoding" = gzip; le NSData va décoder. Si vous souhaitez le décoder automatiquement, procédez ensuite. L'utilisation d'une API privée ne peut pas s'appliquer à l'App Store.

//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); 
+0

J'ai déposé une demande à bugreport.apple.com que cette API ou une API équivalente soit rendue publique. http://openradar.appspot.com/radar?id=4931101243998208 – John