You need to enable JavaScript to run this app. Swift如何解析接口返回的HTML格式form-data内容并在iOS应用展示
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 01:15:03