У меня проблемы с написанием SOAP-клиента для IPhone / IOS Obj-C, который взаимодействует с приложением с интерфейсом SOAP WS.Приложение использует веб-сервер php NuSOAP и кодирует любую полезную нагрузку выше определенного размера, используя gzip / deflate, в зависимости от того, что включено клиентом.
Я понимаю, что NSURLConnection прозрачно распаковывает любой закодированный gzip ответ и представляет распакованный ответ, нонеобработанный ответ, полученный в этом случае, кажется поврежденным.Я сбросил полезную нагрузку SOAP в файл и распаковал его с помощью gunzip, он жалуется на «неожиданный конец файла».Я проверил веб-сервер и выгрузил ответ gzip, который он отправляет в файл, он распаковывается без каких-либо ошибок с помощью gunzip.Похоже, что ответ получен при получении.
Я попытался использовать NSURLConnection и ASIHTTPRequest.При использовании NSURLConnection существует разность ровно 15 байтов каждый раз между длиной данных ответа и длиной, указанной в заголовке HTTP ответа.С помощью ASIHTTPRequest количество полученных байтов и длина ответа в совпадении заголовка HTTP, но, увы, ответ все еще поврежден и не отвечает на распаковку gzip.
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Headers :%@",[(NSHTTPURLResponse*)response allHeaderFields]);
[self.receivedData setLength:0];
self.receivedData = [[NSMutableData dataWithCapacity:1024*1024] retain];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)value {
NSString *dataRec = [[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding];
NSLog(@"didReceiveData :%@",dataRec);
[self.receivedData appendData:value];
}
2010-10-04 13: 37: 15.310 SugarSoap [848: 207] Заголовки: {"Cache-Control" = "no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0";Connection = "Keep-Alive";"Content-Encoding" = gzip;«Content-Length» = 1683;"Content-Type" = "text / xml; charset = UTF-8";Дата = "Пн, 04 октября 2010 г. 08:07:14 по Гринвичу";Истекает = "Четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу";"Keep-Alive" = "Тайм-аут = 15, максимум = 100";Pragma = "без кеша";Сервер = "Apache / 2.0.59 (Unix) mod_ssl / 2.0.59 OpenSSL / 0.9.8g DAV / 2 PHP / 5.2.5";"Set-Cookie" = "PHPSESSID = udsgtttvts90ijuhsvuqop6ja6; path = /";Vary = "Accept-Encoding";"X-Powered-By" = "PHP / 5.2.5";"X-Soap-Server" = "NuSOAP / 0.7.2 ()";} 2010-10-04 13: 37: 15.311 SugarSoap [848: 207]
didReceiveData: (null) 2010-10-04 13: 37: 15.311 SugarSoap [848: 207] connectionFinsihed!Длина: 1668
-(void)requestFinished:(ASIHTTPRequest *)request {
if([request isResponseCompressed]){
NSLog(@"Response Compressed.");
}
NSData *compressedResponse = [request rawResponseData];
NSData *responseData = [request responseData];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"Length before decompression:%d Length after decompression:%d", compressedResponse length],[responseData length]);
NSLog(@"Response :%@",responseString);
}
2010-10-04 14: 11: 20.687 Hello_SOAP [1033: 207] Сжатый ответ.
2010-10-04 14:11: 20.687 Hello_SOAP [1033: 207] Длина до распаковки: 2165 Длина после распаковки: 0
2010-10-04 14: 11: 20.687 Hello_SOAP [1033: 207] Ответ: