Ответ 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];