2012-05-02 64 views
9

Estoy desarrollando aplicaciones para iPhone y construyendo manualmente solicitudes POST. Actualmente, es necesario comprimir datos JSON antes de enviarlos, por lo que se busca comprimir cómo se le comprueba a un servidor el contenido. Establecer el encabezado del tipo de contenido en gzip podría no ser aceptable porque el servidor espera datos JSON. Estoy buscando una solución transparente, algo así como simplemente agregar un encabezado que indique que los datos de JSON están comprimidos en gzip.¿Cómo enviar la solicitud HTTP POST con contenido gziped?

Lo sé, la forma estándar es decirle al servidor que el cliente acepta la codificación, pero primero debe hacer la solicitud GET con la cabecera de codificación aceptada. En mi caso, quiero publicar los datos ya codificados.

+0

Encontrado: http://serverfault.com/questions/56700/is-it-possible-to-enable-http-compression-for-requests – Centurion

Respuesta

-1

Implementar algunos métodos generales como los siguientes y configurar el encabezado apropiado puede ser útil.

// constructing connection request for url with no local and remote cache data and timeout seconds 
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:callingWebAddress]];// cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:timoutseconds]; 
[request setHTTPMethod:@"POST"]; 

NSMutableDictionary *headerDictionary = [NSMutableDictionary dictionary]; 
[headerDictionary setObject:@"application/json, text/javascript" forKey:@"Accept"]; 
[headerDictionary setObject:@"application/json" forKey:@"Content-Type"]; 

//Edit as @centurion suggested 
[headerDictionary setObject:@"Content-Encoding" forKey:@"gzip"]; 
[headerDictionary setObject:[NSString stringWithFormat:@"POST /Json/%@ HTTP/1.1",method] forKey:@"Request"]; 
[request setAllHTTPHeaderFields:headerDictionary]; 

// allocation mem for body data 
self.bodyData = [NSMutableData data]; 

[self appendPostString:[parameter JSONFragment]]; 

// set post body to request 
[request setHTTPBody:bodyData]; 

NSLog(@"sending data %@",[[[NSString alloc] initWithData:bodyData encoding:NSUTF8StringEncoding]autorelease]); 

// create new connection for the request 
// schedule this connection to respond to the current run loop with common loop mode. 
NSURLConnection *aConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
//[aConnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 
self.requestConnenction = aConnection; 
[aConnection release]; 
+0

Hm, no ven encabezados relacionados de codificación. Acabo de buscar en Google, debes configurar el encabezado "Content-Encoding: gzip" – Centurion

+0

No hay nada sobre gzip aquí ... –

16

Incluir un envoltorio gzip Obj-C, por ejemplo NSData+GZip, y lo utilizan para codificar el cuerpo de su NSURLRequest. Recuerde también configurar el Content-Encoding en consecuencia, para que el servidor web sepa cómo tratar su solicitud.

NSData *requestBodyData = [yourData gzippedData]; 
NSString *postLength = [NSString stringWithFormat:@"%d", requestBodyData.length]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"]; 
[request setHTTPBody:requestBodyData]; 
Cuestiones relacionadas