1. 程式人生 > >ios-NSURL URLWithString:relativeToURL的坑

ios-NSURL URLWithString:relativeToURL的坑

先說前提

某個具體介面的路徑是 “/user/getInfo”,

NSURL *baseURL = [NSURL URLWithString:@"https://api.mydomain.com/api"];
NSURL *relativeURL = [NSURL URLWithString:@"/user/getInfo" relativeToURL:baseURL];

而得到的結果是

https://api.mydomain.com/user/getInfo

/api 這段沒了。。。。

為了搞清怎麼拼接 各種試

NSURL *baseURL1 = [NSURL URLWithString:@"https://api.mydomain.com/api/"];
NSURL *baseURL2 = [NSURL URLWithString:@"https://api.mydomain.com/api"];


NSURL *relativeURL1 = [NSURL URLWithString:@"/user/getInfo" relativeToURL:baseURL1];
NSURL *relativeURL2 = [NSURL URLWithString:@"/user/getInfo" relativeToURL:baseURL2];
NSURL *relativeURL3 = [NSURL URLWithString:@"user/getInfo" relativeToURL:baseURL1];
NSURL *relativeURL4 = [NSURL URLWithString:@"user/getInfo" relativeToURL:baseURL2];


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

結果是

1: https://api.mydomain.com/user/getInfo
2: https://api.mydomain.com/user/getInfo
3: https://api.mydomain.com/api/user/getInfo
4: https://api.mydomain.com/user/getInfo

可見,只有第3種情況符合我們的預期

查一下RFC1808 Relative Uniform Resource Locators 原因找到了 1.如果baseulr沒有以"/"結尾,則最後一個"/"的內容都會被忽略 2.如果relativeUrl以"/"開始,則被認為是從域名的根路徑下開始,baseurl域名後的內容都會被忽略

所以 正確的用法是 1.baseurl要以"/"結尾 2.relativeUrl不能以"/"開始