ios-NSURL URLWithString:relativeToURL的坑
阿新 • • 發佈:2018-12-10
先說前提
某個具體介面的路徑是 “/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不能以"/"開始