• Александр Черный
  • Блог
  • Проекты
  • О себе
  • RSS
23 сентября 2010

Кодирование 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. Набор экранируемых символов можно задать для своих нужд, разумеется.

  1. NSString — документация Apple
  2. NSURL — документация Apple

objective-c   

Ваш комментарий


(не будет опубликован)


© Александр Черный, 2009–2026

Служебный вход

Работает на YAPSE, β