URL中包含|字符导致无法正常加载维基百科API返回内容的问题
问题成因
|属于RFC 3986 URL规范中定义的非安全保留字符,不能直接出现在URL的查询参数中。iOS的NSURL类在解析包含未编码|的字符串时,会直接判定URL格式非法,初始化失败,因此absoluteString属性返回null。- 报错码
-1002对应的是NSURLErrorUnsupportedURL,本质就是系统识别到传入的URL格式不符合标准,无法发起请求。
解决方案
- 仅对URL的参数值部分做URL百分号编码,不要直接编码整个URL字符串,避免把
://、?、&等合法URL分隔符也转义。|编码后的对应值为%7C,Objective-C编码示例如下:
// 原始多id参数 NSString *rawPageIds = @"1|2|3"; // 仅对参数值做URL编码,使用查询参数允许的字符集过滤 NSString *encodedPageIds = [rawPageIds stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 拼接生成合法URL字符串 NSString *requestUrlStr = [NSString stringWithFormat:@"https://en.wikipedia.org/w/api.php?action=query&format=json&pageids=%@&prop=extracts&exintro&explaintext", encodedPageIds]; NSURL *validUrl = [NSURL URLWithString:requestUrlStr];
- 不推荐使用
initWithContentsOfURL执行网络请求,该方法是同步阻塞接口,会卡住调用线程,若在主线程调用会导致界面无响应,建议替换为NSURLSession的异步请求方案:
NSURLRequest *request = [NSURLRequest requestWithURL:validUrl]; [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"请求失败: %@", error.localizedDescription); return; } // 解析返回的JSON数据 NSError *jsonError; NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError]; if (result) { NSLog(@"请求成功: %@", result); } }] resume];
内容的提问来源于stack exchange,提问作者Vulkan
相关产品推荐
相关产品推荐

