NSURLConnection делегат didReceiveData завершающие символы в данных - PullRequest
5 голосов
/ 10 июля 2009

Я действительно изо всех сил пытался выяснить, почему мой вызов веб-службы пронизан ненужными данными.

У меня есть UITableViewController, который вызывает веб-сервис и действует как NSURLConnectionDelegate.

Вот интересующий метод делегата, обратите внимание на операторы NSLog.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"data %@", [[NSString alloc] initWithUTF8String: [data bytes]]);
    NSLog(@"before %@", [NSString stringWithUTF8String: self.rawData.bytes]);
    [self.rawData appendData:data];
    NSLog(@"after %@", [NSString stringWithUTF8String: self.rawData.bytes]);
}

Вот итоговый журнал после нескольких попыток:

2009-07-10 09:04:20.339 SundialInvoice[91493:20b] data {"items": [], "request": 

"/inventory/delivered.json"}
2009-07-10 09:04:20.339 SundialInvoice[91493:20b] before 
2009-07-10 09:04:20.340 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:23.153 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}l 4] [Mes
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] before 
2009-07-10 09:04:23.154 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:27.913 SundialInvoice[91493:20b] data (null)
2009-07-10 09:04:27.913 SundialInvoice[91493:20b] before 
2009-07-10 09:04:27.914 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

2009-07-10 09:04:30.486 SundialInvoice[91493:20b] data {"items": [], "request": "/inventory/delivered.json"}ice/1.0 CFN
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] before 
2009-07-10 09:04:30.487 SundialInvoice[91493:20b] after {"items": [], "request": "/inventory/delivered.json"} SundialInvoice] [PID 

Откуда поступают конечные данные мусора? Я несколько раз запускал веб-сервис с curl, и мусор не исходит от него.

Ответы [ 3 ]

11 голосов
/ 10 июля 2009

Чтобы создать NSString из NSData, вы должны использовать initWithData:encoding:, как показано ниже:

NSString *str = [[NSString alloc] initWithData:self.rawData
                                      encoding:NSUTF8StringEncoding];
NSLog(@"Before: %@", str);
[str release];

Обработка NSData байтов строкой C может привести к некоторым уязвимостям безопасности.

6 голосов
/ 10 июля 2009

Я думаю, что мусор исходит от регистрации:

[NSString stringWithUTF8String:self.rawData.bytes]

Здесь вы говорите, что вы хотите NSString от этой C-строки (= массив байтов, оканчивающихся на ноль). Проблема в том, что метод bytes NSData не возвращает данные, оканчивающиеся на ноль, потому что это обычный массив, а не C-строка. Поэтому инициализатор NSString захватывает даже байты после окончания полученного NSData, пока не достигнет некоторого нулевого байта, ранее сохраненного в памяти.

1 голос
/ 10 июля 2009

попробуйте следующее:

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [rawData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"%@",rawData);
}

Также, что вы объявили rawData как ???

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