NSURL 是 Foundation 框架中處理統一資源定位器的核心類,支持 URL 組件分解、網絡資源同步加載。本文通過完整控制台示例演示 Scheme/Host/Port/Path 提取、HTML 內容讀取,並解析端口為 null 的常見疑惑。
// main.m #importint main(int argc, const char * argv[]) { @autoreleasepool { // 1. 從字符串創建 NSURL NSString *urlString = @"https://blog.csdn.net/FansUnion"; NSURL *url = [NSURL URLWithString:urlString]; // 2. 提取 URL 組件 NSString *scheme = [url scheme]; // 協議 NSString *host = [url host]; // 主機 NSString *port = [url port]; // 端口 (可能為 nil) NSString *path = [url path]; // 路徑 NSLog(@"scheme : %@", scheme); NSLog(@"host : %@", host); NSLog(@"port : %@", port); NSLog(@"path : %@", path); // 3. 同步加載 URL 內容 (編碼指定 UTF-8) NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@", content); // 輸出 HTML 內容 (過長此處省略) } return 0; }
scheme : http host : blog.csdn.net port : (null) // ← 關鍵觀察點 path : /FansUnion ... HTML 內容 ...
https://blog.csdn.net/FansUnion 採用 HTTP 默認端口 80NSURL 設計哲學:**只返回顯式出現在 URL 中的端口**,默認端口不顯式返回http→80, https→443, ftp→21// 輔助方法:獲取實際端口
- (NSInteger)actualPort {
if (self.port) return [self.port integerValue];
if ([self.scheme isEqualToString:@"http"]) return 80;
if ([self.scheme isEqualToString:@"https"]) return 443;
return -1; // 未知協議
}
| 屬性/方法 | 返回類型 | 說明 | 示例值 |
|---|---|---|---|
scheme | NSString* | 協議方案 | http, https, ftp, file |
host | NSString* | 主機名/IP | blog.csdn.net |
port | NSString* | **顯式**端口號 | 8080 或 nil |
path | NSString* | 路徑 (含首個 /) | /FansUnion |
query | NSString* | 查詢字符串 (不含 ?) | id=123&name=test |
fragment | NSString* | 片段標識符 (不含 #) | section1 |
user/password | NSString* | 用戶信息 (已棄用/不推薦) | - |
parameterString | NSString* | 參數字符串 (罕見,; 分隔) | - |
// 生產環境推薦:異步加載 + 錯誤處理
NSURL *url = [NSURL URLWithString:@"https://api.example.com/data"];
NSURLRequest *request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:15.0];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (error) {
NSLog(@"加載失敗: %@", error.localizedDescription);
return;
}
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"內容長度: %lu", (unsigned long)content.length);
// 處理內容...
}];
NSURLConnection,支持後台下載、斷點續傳、HTTP/2NSURLComponents:構建/解析 URL 更安全,自動處理百分號編碼NSURL 雖屬基礎類,但其「默認端口不顯式返回」的設計細節常讓初學者困惑。理解這一語義,配合 NSURLComponents 與 NSURLSession 現代 API,能構建健壯的網絡層代碼。