Вы не будете в процентах экранировать значения запроса, прежде чем подставлять их в строку. Я только что провёл небольшой тест и обнаружил, что если установить urlToPublish
на «http://example.com",», то NSURL
преобразует его в «http: /example.com».
Это потому, что значение запроса содержит специальные символы, что означает, что вам нужно добавить процентные экранированные символы. По крайней мере, вы можете использовать посредственные -[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 = @"foo@example.com";
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];