Swift中使用URLSession.shared.data请求API时如何启用JavaScript?
问题解决:URLSession请求API返回浏览器兼容提示
问题现象
使用以下代码请求API时:
let (retrieved_data, error) = try await URLSession.shared.data(from: apiURL!)
返回两条错误提示:
Your Browser is not supported. Please use IE10 or later!
You need to enable JavaScript to run this app
原因分析
服务器通过请求头中的User-Agent字段识别客户端类型,URLSession默认的User-Agent是应用专属标识(例如YourApp/1.0 (iPhone; iOS 16.0)),被服务器判定为不兼容的浏览器;而"需要启用JavaScript"的提示通常是同一检测逻辑的附带结果,并非真的需要执行JS——因为URLSession本身是纯网络请求工具,不具备JS执行环境。
解决方案
自定义URLRequest,模拟现代浏览器的请求头,重点设置User-Agent字段:
示例代码
guard let apiURL = apiURL else { fatalError("Invalid API URL") } // 构造请求并设置浏览器模拟头 var request = URLRequest(url: apiURL) // 模拟Safari浏览器的User-Agent(可根据需要换成Chrome等其他浏览器UA) request.setValue( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", forHTTPHeaderField: "User-Agent" ) // 补充Accept头,匹配常见API的接受格式 request.setValue( "application/json, text/plain, */*", forHTTPHeaderField: "Accept" ) do { let (retrievedData, response) = try await URLSession.shared.data(for: request) // 解析retrievedData中的JSON内容 if let json = try? JSONSerialization.jsonObject(with: retrievedData) { print(json) } } catch { print("Request error: \(error.localizedDescription)") }
额外提示
如果设置User-Agent后仍然报错,可能服务器还在验证其他请求头(如Referer、Cookie),或该API依赖浏览器环境生成的会话信息。这种情况下可以尝试:
- 添加更多浏览器常用请求头(如
Accept-Language、Cache-Control) - 使用
WKWebView加载目标页面,通过JS注入获取所需数据(适合依赖前端渲染的场景)
内容的提问来源于stack exchange,提问作者Timo R.
相关产品推荐
相关产品推荐

