2010-04-21 21 views
34

¿Alguien sabe si NSURLConnection/NSURLRequest tiene soporte para solicitudes gzip.NSURLConnection/NSURLRequest gzip support

Si lo hace, ¿puede proporcionar más información?

+0

duplicado posible de [Accept-Encoding: gzip en iOS] (http://stackoverflow.com/questions/25333857/accept-encoding-gzip-on-ios) –

+0

@JoshCaswell, comprueba por favor la diferencia de fechas . Fue preguntado 5 años después de que esta pregunta fue publicada. – mxg

+0

[Los duplicados no siempre tienen que apuntar en la dirección de la fecha posterior] (http://meta.stackexchange.com/a/147651/159251). Creo que la respuesta en la otra pregunta es un poco más útil que las que se encuentran aquí. –

Respuesta

63

aunque does not seem to be documented, there is evidence que NSURLConnectionhace tienen el apoyo gzip transparente. lo que significa que si el servidor admite la codificación gzip y su solicitud tiene un encabezado Accept-Encoding que contiene gzip *, el servidor enviará una respuesta comprimida, que NSURLConnection se decodificará automáticamente.

* NSURLRequest podría agregar ese encabezado de forma predeterminada. si no, hay que añadir manualmente este modo:

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

1. creo que necesita una NSMutableURLRequest para agregar un encabezado 2. a partir de "iOS 3.2" como base sdk, el encabezado de aceptación de codificación que contiene deflate y gzip parece incluirse automáticamente (al parecer no solía ser). – hop

+6

Acabo de hacer también pruebas y vi que el iPhone agrega gzip y desinflar de forma predeterminada. ¿Alguien sabe si siempre fue compatible o desde qué versión Apple ha comenzado a incluir Aceptar codificación de forma predeterminada? – Dmitry

+3

¿Qué pasa con las solicitudes de codificación gzip enviadas al servidor? http://stackoverflow.com/questions/6204066/how-to-gzip-an-nsurlconnection-request – ma11hew28

2

NSURLRequest decodifica gzip para NSData; como la respuesta del servidor contiene "Content-Encoding" = gzip; el NSData se decodificará. Si desea decodificarlo automáticamente, haga lo siguiente. El uso de API privada no se puede aplicar a la tienda de aplicaciones.

//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

Solicité en bugreport.apple.com que esta o una API equivalente se haga pública. http://openradar.appspot.com/radar?id=4931101243998208 – John