NSURL URLWithString: relativeToURL: отсечение относительного url

Я пытаюсь реализовать приложение iOS, которое использует RestKit. Во всех примерах, которые я видел до сих пор, для создания URL-адресов используется следующий код:

NSURL *baseURL = [NSURL URLWithString:@"https://api.service.com/v1"];
NSURL *relativeURL = [NSURL URLWithString:@"/files/search" relativeToURL:baseURL];

а то [relativeURL absoluteString] вернутся https://api.service.com/files/search.

поэтому я попробовал несколько примеров:

NSURL *baseURL1 = [NSURL URLWithString:@"https://api.service.com/v1/"];
NSURL *baseURL2 = [NSURL URLWithString:@"https://api.service.com/v1"];
NSURL *baseURL3 = [NSURL URLWithString:@"/v1" relativeToURL:[NSURL URLWithString:@"https://api.service.com"]];

NSURL *relativeURL1 = [NSURL URLWithString:@"/files/search" relativeToURL:baseURL1];
NSURL *relativeURL2 = [NSURL URLWithString:@"/files/search" relativeToURL:baseURL2];
NSURL *relativeURL3 = [NSURL URLWithString:@"/files/search" relativeToURL:baseURL3];
NSURL *relativeURL4 = [NSURL URLWithString:@"files/search" relativeToURL:baseURL1];
NSURL *relativeURL5 = [NSURL URLWithString:@"files/search" relativeToURL:baseURL2];
NSURL *relativeURL6 = [NSURL URLWithString:@"files/search" relativeToURL:baseURL3];

NSLog(@"1: %@", [relativeURL1 absoluteString]);
NSLog(@"2: %@", [relativeURL2 absoluteString]);
NSLog(@"3: %@", [relativeURL3 absoluteString]);
NSLog(@"4: %@", [relativeURL4 absoluteString]);
NSLog(@"5: %@", [relativeURL5 absoluteString]);
NSLog(@"6: %@", [relativeURL6 absoluteString]);

и это выход:

1: https://api.service.com/files/search
2: https://api.service.com/files/search
3: https://api.service.com/files/search
4: https://api.service.com/v1/files/search
5: https://api.service.com/files/search
6: https://api.service.com/files/search

таким образом, единственный пример, возвращающий то, что я хочу, - #4. Кто-нибудь может объяснить почему?

3 ответов


я прочитала [RFC1808] который определяет нормативный алгоритм разрешения относительных URL-адресов

2 вопроса:

  1. относительный url не может начинаться с a / или считается абсолютным:

    Step 4: If the embedded URL path is preceded by a slash "/", the
       path is not relative and we skip to Step 7."
    
  2. когда базовый url заканчивается без косой черты. все, начиная с последнего Слэша, пропускается

    Step 6: The last segment of the base URL's path (anything
       following the rightmost slash "/", or the entire path if no
       slash is present) is removed and the embedded URL's path is
       appended in its place.  The following operations are
       then applied, in order, to the new path:"
    

это все объясняет. baseURL должен заканчиваться на A / и относительный url не должен начинаться с /


у вас есть две проблемы:

во-первых, строку /files/search Это абсолютное путь, так как он начинается с косой черты. Разрешение его против любого существующего URL-адреса будет игнорировать существующий путь.

во-вторых, https://api.service.com/v1 не имеет косую черту, чтобы указать, что это каталог. Любые строки, разрешенные против него, всегда будут игнорировать v1 часть.

в заключение, вам нужна эта комбинация относительного пути -files/search - и URL базы каталогов - https://api.service.com/v1/.


еще пример:

//it's right
NSURL *url = [NSURL URLWithString:@"getValidNumber" relativeToURL:[NSURL URLWithString:@"http://dns.test.com:22009/service/"]]; 

//error
NSURL *url = [NSURL URLWithString:@"getValidNumber" relativeToURL:[NSURL URLWithString:@"dns.test.com:22009/service/"]]; 

//error
NSURL *url = [NSURL URLWithString:@"/getValidNumber" relativeToURL:[NSURL URLWithString:@"http://dns.test.com:22009/service"]];

` Для использования этого метода необходимо использовать " http://".