23

RestKit を使用する iOS アプリを実装しようとしています。これまでに見たすべての例で、次のコードを使用して 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 です。誰でも理由を説明できますか?

4

3 に答える 3

51

相対 URL を解決するための規範的アルゴリズムを定義する[RFC1808]を読みました

2 つの問題:

  1. 相対 URL は / で始まらないか、絶対 URL と見なされます。

     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 は / で終わる必要があり、相対 URL は / で始まらない

于 2013-05-16T08:32:28.280 に答える
0

もう一つの例:

//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://' が必要です。

于 2016-01-13T09:05:16.317 に答える