ASIHTTPRequest работает только тогда, когда я жестко кодирую строки

#iphone #objective-c

#iPhone #objective-c

Вопрос:

У меня проблема, которая действительно заставляет меня почесать голову. Кажется, нет логической причины, почему это происходит. Если я жестко кодирую строку в NSURL, она работает. Но если вместо этого я передаю NSString, это не сработает. Я подтвердил, что NSString идентична жестко закодированной строке с помощью NSLog для них обоих.

Код, который работает. Сервер возвращает код ответа 200.

         //NSString * urlStr = [NSString stringWithFormat:@"http://www.server.com/%@",monograph.uri];
    NSURL *url = [NSURL URLWithString:@"http://www.server.com/api/monograph/com/3894.json"];

    ASIHTTPRequest *request; 
    request = [ASIHTTPRequest requestWithURL:url];
    [request setUsername:appDelegate.key];
    [request setPassword:appDelegate.secret];
    [request setDelegate:self];
    [request startAsynchronous];
  

Код, который завершается с ошибкой. Сервер возвращает 204 кода ответа для этого:

 NSString * urlStr = [NSString stringWithFormat:@"http://www.server.com/%@",monograph.uri];
    NSURL *url = [NSURL URLWithString:urlStr];

    ASIHTTPRequest *request; 
    request = [ASIHTTPRequest requestWithURL:url];
    [request setUsername:appDelegate.key];
    [request setPassword:appDelegate.secret];
    [request setDelegate:self];
    [request startAsynchronous];
  

Когда я NSLog urlStr, он содержит:

 http://www.server.com/api/monograph/com/3894.json
  

Что я упускаю из виду? Должно быть что-то, объясняющее это -.-

С уважением, код

Редактировать

проверил длину обеих строк, и они обе одинаковой длины, поэтому, похоже, там нет пробелов или чего-либо скрытого.

Комментарии:

1. Вы уверены, что monograph.uri — это @»api/monograph/com/3894.json»? Поместите в него nslog.

2. Вы уверены, что это код ответа 204? 204 означает «успех, но нет тела». Это опечатка для 404?

3. Нет, это определенно 204. Когда это действительно должно быть 200. Поскольку это ответ, который я получаю, когда я жестко кодирую строку URL.

4. Откуда берется monograph.uri? Должно быть, проблема с кодовой страницей со свойством, которое маскирует NSLog. Есть ли у вас контроль над сервером, чтобы попытаться просмотреть входящие запросы?

Ответ №1:

Вы проверили, не равен ли объект NSURL, который вы получаете из строковой переменной, нулю? Это могло бы помочь вам разобраться в локализации проблемы.

Кроме того, вы можете попробовать экранировать строковую переменную, просто если с вызовом stringWithFormat происходит что-то забавное.

Комментарии:

1. Что вы подразумеваете под экранированием строки var? Спасибо -Code

2. string = [строка stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

3. Попробовал это, и, увы, изменений не было.

4. Я регистрирую URL-адрес NSURL *, и он содержит правильный URL-адрес. Это безумие -.-

5. Попробуйте создать оба NSURLs (тот, который работает, и тот, который не работает), и проверьте, равны ли их urlStrings. Затем начните с жестко закодированного URL-адреса и используйте urlString этого NSURL для создания второго и посмотрите, работает ли второй. Да, это безумие.

Ответ №2:

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

попробуйте

NSString * s = [monograph.uri stringByTrimmingCharactersInSet:[nscaracterset Набор пробелов и новых линейных символов]];

NSString * urlStr = [NSString stringWithFormat:@»http://www.server.com /%@»,s];

Комментарии:

1. вы сделали именно это: > NSString *s = [monograph.uri stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; > NSString * urlStr = [NSString stringWithFormat:@» server.com /%@ «, s]; ? (Я также отредактировал ответ)