2012-01-17 2 views
1

Я использую sendSynchronousRequest: returnResponse: метод ошибки класса NSURLConnection для получения NSData из сети.Как проверить целостность данных при использовании NSURLConnection sendSynchronousRequest?

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

То, что я хочу сделать, это проверить, если возвращаемое значение является действительным или нет. Итак, я сделал, чтобы сравнить длину данных с ожидаемой длиной в заголовке ответа, как показано ниже.

NSData *urlData; 
do { 
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    if ([urlData length] != [response expectedContentLength]) { 
     NSLog(@"WTF!!!!!!!!! NSURLConnection response[%@] length[%lld] [%d]", [[response URL] absoluteString], [response expectedContentLength], [urlData length]); 
     NSHTTPURLResponse *httpresponse = (NSHTTPURLResponse *) response; 
     NSDictionary *dic = [httpresponse allHeaderFields]; 
     NSLog(@"[%@]", [dic description]); 
    } 
} while ([urlData length] != [response expectedContentLength]); 

Однако я не знаю, достаточно ли этого для обеспечения целостности возвращенных данных. Я не могу проверить контрольную сумму файла на удаленном сервере.

Вы можете поделиться своим опытом или другими советами?

Спасибо.

+0

Вы проверяете длину данных, а не целостность. В зависимости от того, насколько важна целостность для вас, вы можете реализовать алгоритм, основанный на хеше, или более сложную подпись сообщения, или использовать HTTPS. Но в любом случае это потребует работы на стороне сервера. Клиентский хэш или подписывает сообщение, затем сервер проверяет. Вы упомянули, что не можете сделать это на стороне сервера, поэтому целостность не может быть гарантирована. –

ответ

2

Создание двух переменных в классе, чтобы сохранить длину данных в данный момент загруженных и длину данных ожидаемого (вы могли бы сделать более изящным)

int downloadedLength; 
int expectedLength; 

Чтобы узнать длину ожидаемых данных, которые вы должны получить его от didReceiveResponse делегата

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 

// NSLog(@"expected: %lld",response.expectedContentLength); 
    expectedLength = response.expectedContentLength; 
    downloadedLength = 0; 
} 

обновить downloadedLenght, вы должны увеличить его в didReceiveData:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
downloadedLength = downloadedLength + [data length]; 
//...some code 
} 

тогда можно делать какие-либо логику для сравнения, если загруженные данные соответствуют вашим требованиям в connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    if (downloadedLength == expectedLength) { 
     NSLog(@"correctly downloaded"); 
    } 
    else{ 
     NSLog(@"sizes don't match"); 
     return; 
    } 
} 

Я должен был сделать это, чтобы исправить проблемы библиотеки HJCache с большими картинками, которые скачали неполными (в HJMOHandler).

+0

Я столкнулся с этой точной проблемой с этой точной библиотекой. Просто хотел сказать спасибо за то, что он явно объяснил это. – mousebird

Смежные вопросы