Cen*_*ion 10 iphone gzip http objective-c http-post
我正在开发iPhone应用程序并手动构建POST请求.目前,需要在发送之前压缩JSON数据,以便了解如何告知服务器内容是否已压缩.将内容类型标头设置为gzip可能是不可接受的,因为服务器需要JSON数据.我正在寻找透明的解决方案,就像添加一些标题,告诉JSON数据压缩成gzip.
我知道,标准的方法是告诉服务器客户端接受编码,但是你需要首先使用accept编码头发出GET请求.就我而言,我想发布已编码的数据.
And*_*Ley 19
例如NSData+GZip,包括一个Obj-C gzip包装器,并用它来编码你的身体NSURLRequest.还要记得相应地设置Content-Encoding,以便网络服务器知道如何处理您的请求.
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];
Run Code Online (Sandbox Code Playgroud)
Rah*_*rma -2
实现一些通用方法(如下所示)并设置适当的标头可能会对您有所帮助。
// 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];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7678 次 |
| 最近记录: |