Swift如何解析接口返回的HTML格式form-data内容并在iOS应用展示
iOS端表单请求与HTML响应解析实现方案
1. 修复请求代码错误
你现有代码存在两个核心问题,会导致请求无法正确返回预期结果:
- 末尾的
urlRequest = .init(url: url!)语句会重置整个请求实例,之前配置的请求方法、请求头、请求体都会被清空,直接删除这行即可。 - 你提交的是普通键值对表单参数,
Content-Type配置错误,应该改为application/x-www-form-urlencoded,application/form-data仅用于带文件上传的多部分表单场景。
修正后的请求基础代码如下:
guard let url = URL(string: "你的API端点地址") else { return } var urlRequest = URLRequest(url: url) // 修正Content-Type urlRequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") urlRequest.httpMethod = "POST" let postString = "year=2021&season=Outdoor&province=ON&age_group=OPEN&age_sub_group_masters=ALL&age_sub_group_para=ALL&rankings_event=100m&best_by_athlete=1&rankings_event_spec_num=1&is_relay_EVENT=0&page=1" urlRequest.httpBody = postString.data(using: .utf8)
2. HTML响应解析方案
推荐使用第三方HTML解析库SwiftSoup完成解析,它支持DOM节点遍历、CSS选择器,可高效提取HTML中的结构化数据,无需手动处理标签容错逻辑。
集成方式
通过CocoaPods集成,在Podfile中添加以下配置后执行pod install即可:
pod 'SwiftSoup'
完整请求+解析示例代码
// 发送请求 URLSession.shared.dataTask(with: urlRequest) { data, response, error in guard let data = data, error == nil, let htmlStr = String(data: data, encoding: .utf8) else { print("请求失败: \(error?.localizedDescription ?? "未知错误")") return } do { // 解析HTML let doc = try SwiftSoup.parse(htmlStr) // 示例:提取页面中的表格数据(根据实际返回的HTML结构调整选择器) let tableRows = try doc.select("table tr") // 遍历行提取数据,存储到自定义模型数组中 var rankList = [RankModel]() for row in tableRows.array().dropFirst() { // dropFirst跳过表头 let tds = try row.select("td").array() guard tds.count >= 3 else { continue } let rank = try tds[0].text() let athleteName = try tds[1].text() let score = try tds[2].text() rankList.append(RankModel(rank: rank, name: athleteName, score: score)) } // 回到主线程刷新UI DispatchQueue.main.async { // 用rankList刷新列表视图 } } catch { print("HTML解析失败: \(error)") } }.resume() // 自定义数据模型 struct RankModel { let rank: String let name: String let score: String }
3. 结果展示
解析得到结构化的模型数组后,直接通过UITableView或者UICollectionView即可在界面上渲染展示,按需配置自定义Cell的UI即可。
内容的提问来源于stack exchange,提问作者hermanj96
相关产品推荐
相关产品推荐

