You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

URL中包含|字符导致无法正常加载维基百科API返回内容的问题

问题成因
  • |属于RFC 3986 URL规范中定义的非安全保留字符,不能直接出现在URL的查询参数中。iOS的NSURL类在解析包含未编码|的字符串时,会直接判定URL格式非法,初始化失败,因此absoluteString属性返回null。
  • 报错码-1002对应的是NSURLErrorUnsupportedURL,本质就是系统识别到传入的URL格式不符合标准,无法发起请求。
解决方案
  1. 仅对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];
  1. 不推荐使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 03:06:05