NSURLConnection: ответ SOAP в кодировке gzip поврежден - PullRequest
5 голосов
/ 04 октября 2010

У меня проблемы с написанием 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] Ответ:

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

может быть эта ссылка поможет вам ... генерация кода для мыла

0 голосов
/ 05 ноября 2010

Вы уверены, что -connection:didReceiveData: не вызывается хотя бы один раз до -connection:didReceiveResponse:? Похоже, что вы, возможно, усекаете некоторые данные из первого пакета с заголовками.

0 голосов
/ 05 ноября 2010

Вы уверены, что ваши данные в формате UTF8? Попробуйте другие кодировки и посмотрите, исчезнет ли ваша ошибка.

0 голосов
/ 01 ноября 2010

Однажды у меня была проблема, когда слегка поврежденный файл разархивировался без проблем на моем Mac, а на iPhone - нет. Я полагаю, что zlib на iPhone менее терпим к ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...