#iphone #objective-c #ios
#iPhone #objective-c #iOS
Вопрос:
В IOS я хочу определить пары NSURL
s, которые либо идентичны, либо немного отличаются, но относятся к одному и тому же месту назначения. Например, http://google.com
vs http://google.com/
.
isEquals
сообщает об этих NSURLs как о разных. Я также не могу найти способ получить «каноническую» или «нормализованную» форму NSURL для сравнения этих форм вместо этого.
NSURL *a = [NSURL URLWithString:@"http://google.com"];
NSURL *b = [NSURL URLWithString:@"http://google.com/"];
if([a isEqual:b]) {
NSLog(@"Same"); // Not run
}
if([[a absoluteURL] isEqual:[b absoluteURL]]) {
NSLog(@"Same"); // Still not run
}
if([[a URLByStandardizingPath] isEqual:[b URLByStandardizingPath]]) {
NSLog(@"Same"); // Still not run
}
Как я могу сравнить два NSURLs, игнорируя различия в строках, которые не влияют на назначение URL?
Комментарии:
1. какова ваша цель здесь? применимо ли это только к завершающим косым чертам, применимо ли это также к параметрам? файлы?
2. Не параметры, поскольку это повлияло бы на назначение URL.
3. Мотивация заключается в том, что
UIWebViewDeglate
‘ыwebView:shouldStartLoadWithRequest..
могут указывать URL-адреса в форме, отличной от формы, отправленной вUIWebView:loadRequest
.4. Я видел веб-сайты, где
http://host/somepath
иhttp://host/somepath/
дают разные результаты, поэтому я не думаю, что есть общее решение для вашей проблемы.5. И
-URLByStandardizingPath
работает только с URL-адресами файловой системы.
Ответ №1:
Согласно RFC 2616, http://google.com
и http://google.com/
эквивалентны. Вот что там написано (раздел 3.2.3):
При сравнении двух URI, чтобы решить, совпадают они или нет, клиент ДОЛЖЕН использовать сравнение всех URI с учетом регистра, с учетом этих исключений:
Пустой или не заданный порт эквивалентен порту по умолчанию для этой ссылки URI;
Сравнение имен хостов ДОЛЖНО быть нечувствительным к регистру;
Сравнение имен схем ДОЛЖНО быть нечувствительным к регистру;
Пустой abs_path эквивалентен abs_path «/».
Для справки синтаксис приведен в виде http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
К сожалению, NSURL
должен поддерживать схемы, отличные от HTTP, поэтому он не может сделать предположение, что RFC 2616 предоставляет общее правило. Я думаю, что ваше лучшее решение — создать категорию с вашим собственным методом сравнения для http URL, который специально проверяет наличие пустого абсолютного пути.
Комментарии:
1. Хотя JeremyP полностью корректен, разумно ожидать, что либо NSURL (или NSURLRequest) сможет реализовать RFC 2616 для применимых URL. Это не является двусмысленным, когда применяется RFC 2616. Если это повлияет на вас, я бы рекомендовал открыть радар на bugreport.apple.com.