Кодирование URL для NSURL
Была задача: передать JSON объект через адресную стоку браузера в методе GET. Ничто не предвещало беды... Вот только специальные символы мешали обретению счастья, а stringByAddingPercentEscapesUsingEncoding не работал, как было нужно.
В NSString есть стандартный метод stringByAddingPercentEscapesUsingEncoding. Как можно понять из названия, он кодирует строку, экранируя в ней определенные символы с помощью знака процента. Если кодирование не удалось, возвращается nil. Метод работает. Но не кодирует некоторые специальные символы, такие как фигурные скобки или амперсанд... Фигурные скобки используются, в частности, при передаче JSON объекта. Про амперсанд и говорить нечего — стандартный разделитель параметров. Вот вариант, как можно поправить положение.
NSString *baseURL = @"http://www.mysite.com/api/?data=";
NSString *urlParamenets = @"{action:'get'}&repeat=0";
NSString *encodedURLParamenets = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)urlParamenets, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]{}", kCFStringEncodingUTF8);
NSString *fullURL = [NSString stringWithFormat:@"%@%@", baseURL, encodedURLParamenets];
NSURL *requestURL = [NSURL URLWithString:fullURL];
Результатом выполнения этих операций будет строка следующего вида:
http://www.mysite.com/api/?data=%7Baction%3A%27get%27%7D%26repeat%3D0
Обратите внимание, что кодировать параметры имеет смысл отдельно, чтобы под огонь не попали слеши и двоеточие. Дальше строки объединяются. Уже из такой строки создается NSURL. Набор экранируемых символов можно задать для своих нужд, разумеется.
Ваш комментарий