JSON не работает в URL-адресе Objective C - PullRequest
0 голосов
/ 02 ноября 2011

После того, как я весь день стучу в голову, я дошел до StackOverflow, чтобы протащить меня.

Я делаю NSURLRequest в своем приложении для iPhone ...

NSURL* url = [[self serviceUrl] URLByAppendingPathComponent:[NSString stringWithFormat:@"Json"]];

NSString* json = [NSString stringWithFormat:@"{\"id\":\"%@\"}", id];

NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];

этовозвращает мне строку JSON, которая возвращается ко мне, но она не работает, поскольку строка не будет анализироваться правильно.

Однако, если я сделаю обычный запрос на тот же URL в браузере Safari, то JSONвозвращается правильно.Я проверяю этот JSON здесь .

Так в чем же дело?Существует ли ограничение длины данных в NSString *, при котором файл json размером 32 КБ не будет правильно храниться в памяти?Иногда JSON может быть проанализирован, и это заставляет меня поверить, что я неправильно очищаю строку JSON после каждого запроса.

_json = [[NSString alloc] initWithData:_dataResponse encoding:NSUTF8StringEncoding];

NSArray* retrievedData = (NSArray*)[_json JSONValue];

// removed for brevity

_json = @"";

Другая информация, я использую ASP.NET MVC 3 для предоставления веб-сервисовдля этого приложения.

РЕДАКТИРОВАТЬ

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse 
{   
    _loader.hidden = NO;

    [_loadingIndicator startAnimating];

    return request;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{
    _dataResponse = [[NSMutableData alloc] init];

    [_dataResponse setLength:0];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{
    NSLog(@"Error receiving response: %@", error);

    _loader.hidden = YES;

    [_loadingIndicator stopAnimating];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection 
{
    _json = [[NSString alloc] initWithData:_dataResponse encoding:NSUTF8StringEncoding];

    // Removed for brevity

    _json = @"";

    _loader.hidden = YES;

    [_dataResponse release];
    _dataResponse = nil;

    [_loadingIndicator stopAnimating];
}

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ

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

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

К сожалению, ничего вопиющего не выпрыгивает на меня.

Некоторые вещи, которые можно попробовать, мы надеемся, помогут:

  • , дважды проверьте ваш шаблон NSUrlConnection по этому документу.Единственное различие, которое я вижу, это то, что они сохраняют [[NSMutableData data]] вместо alloc, init.Они также создают NSMutableData с запросом соединения (не в ответе) и только длиной = 0 в ответе.Не уверен, почему это будет иметь значение, хотя ...

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

  • попробуйте что-то вроде Чарльза Прокси.Это позволяет вам нюхать провод.Вы можете увидеть разницу между браузером и симулятором / доступом к телефону.Как минимум, вы увидите, что происходит по плохим случаям.

  • добавляет много журналов.каждый раз, когда вы добавляете данные, регистрируйте некоторые детали.После преобразования в строку и перед вызовом json войдите в систему.Размеры журналов и т. Д. Что-то может подсказать вам подсказку.

  • использование строки _json кажется немного неправильным.Вы перераспределяете и затем устанавливаете пустую строку.У вас должен быть iVar, который вы выделяете и выпускаете (не установлен на ""), или создаете @property с retain, copy.

0 голосов
/ 02 ноября 2011

Вы обязательно должны включить charset=utf8 в свой заголовок типа контента. И как вы узнаете, что полученный вами ответ закодирован как utf8? Вы также должны установить заголовок content-size.

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