Потеря/при конвертации из NSURL в NSURLRequest

Я делаю HTTP-сообщение в своем приложении iphone, и один из параметров, которые я отправляю на сервер, - это URL-адрес. Проблема в том, что когда я конвертирую из NSURL в NSURLRequest, строка http://www.slashdot.org становится http:/www.slashdot.org(отсутствует одна из косых черт )

Есть ли способ обойти это?

вот код, который я использую:

NSString *host = @"example.host.com";
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish];
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *jsonString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

Я использовал NSLog, чтобы увидеть, где он теряет '/', и он на четвертой строке:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

спасибо за потраченное время на чтение!

Ответ 1

Вы не используете процентные значения для запроса, прежде чем подставлять их в строку. Я просто сделал небольшой тест и обнаружил, что если я установил urlToPublish в " http://example.com", тогда NSURL преобразит его в "http:/example.com".

Это связано с тем, что значение запроса содержит специальные символы, что означает, что вам нужно добавить процентные escape-последовательности. По крайней мере, вы можете использовать посредственный -[NSString stringByAddingPercentEscapesUsingEncoding:] с NSASCIIStringEncoding. Намного лучше было бы использовать другой (и более полный) механизм экранирования, такой как тот, который я предлагаю в этом сообщении.


В этом случае stringByAddingPercentEscapesUsingEncoding: не работает, потому что это довольно паршивый метод. Он работает с инклюзивной моделью, что означает, что вы должны сказать, какие символы вы хотите кодировать процентом. (Под капотом это просто вызов CFURLCreateStringByAddingPercentEscapes()). Эта функция в основном запрашивает у вас строку, которая представляет каждый символ, который ему разрешен для процентного кодирования (как я понимаю, функция). То, что вы действительно хотите, - это эксклюзивная модель: избегайте всего, кроме [этого небольшого набора символов]. Функция, связанная с ней выше, делает это, и вы будете использовать ее следующим образом:

NSString *urlToPublish = [@"http://stackoverflow.com" URLEscapedString_ch];
NSString *host = @"example.host.com";
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish];
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString];

И тогда он правильно построит ваш URL.


Здесь вы можете сделать еще один способ (и сделать это правильно). Перейдите в мою страницу github и загрузите "DDURLBuilder.h" и "DDURLBuilder.m", а затем создайте свой URL-адрес следующим образом:

NSString *localEmail = @"[email protected]";
NSString *urlToPublish = @"http://stackoverflow.com"

DDURLBuilder *b = [DDURLBuilder URLBuilderWithURL:nil];
[b setScheme:@"http"];
[b setHost:@"example.host.com"];
[b setPath:@"SetLeaderUrl.json"];
[b addQueryValue:localEmail forKey:@"leader_email"];
[b addQueryValue:urlToPublish forKey:@"url"];

NSURL *url = [b URL];

Ответ 2

РЕДАКТИРОВАТЬ 1 Я получил проблему, как описано. Но пропустил это в моей работе. (отсюда и понижение голосов:-() Поэтому я удалил код, который я поставил в качестве ответа.

* Изменить 2

Но, связанный с моими комментариями, это использование кода яблока для получения NSURLRequest,

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                    cachePolicy:NSURLRequestUseProtocolCachePolicy
                timeoutInterval:60.0];      

@Dave DeLong: я заметил в Apple "" Руководство по загрузке системы URL-адресов". Пример создания соединения и запроса не использует никаких экранов, Используемый им URL-адрес - это NSURL URLWithString:

Ответ 3

Я исправил это, вот что я должен был сделать:

NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish];
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
urlString = [NSString stringWithFormat:@"%@%@%@",scheme,host,urlString];
NSURL *url = [[NSURL alloc] initWithString:urlString];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];