Подтвердить что ты не робот

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. Может кто-нибудь объяснить, почему?

4b9b3361

Ответ 1

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

2 вопроса:

  • относительный URL-адрес может не начинаться с/или считается абсолютным:

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Другой пример:

//it 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://".