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

如何在Swift的Alamofire中打印错误HTML内容?

解决Alamofire请求失败时HTML响应导致的JSON序列化错误问题

我之前也碰到过一模一样的问题!当API返回HTML而非预期的JSON时,Alamofire默认的JSON序列化器会直接抛出responseSerializationFailed错误,根本拿不到实际的错误内容。下面给你两个实用的解决方案:

方案一:手动处理响应数据(简单直接)

放弃默认的responseJSON,改用responseData先拿到原始数据,优先尝试解析JSON,失败后再转成HTML字符串处理:

Alamofire.request(absolutePath(forApi: functionName), method: apiMethod, parameters: parameters)
    .responseData { response in
        switch response.result {
        case .success(let data):
            // 优先尝试解析JSON
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: data, options: [])
                // 这里处理正常的JSON响应逻辑
                print("成功拿到JSON响应: \(jsonResponse)")
            } catch {
                // JSON解析失败,说明返回的是HTML,转成字符串
                if let htmlError = String(data: data, encoding: .utf8) {
                    print("API返回错误HTML: \(htmlError)")
                    // 你可以在这里提取HTML里的错误信息,比如用正则或者HTML解析库
                }
            }
        case .failure(let requestError):
            // 处理网络层面的错误(比如无网、超时等)
            print("请求本身失败: \(requestError.localizedDescription)")
        }
    }

方案二:自定义响应序列化器(更优雅)

如果你的项目里很多请求都有这种情况,可以自定义一个序列化器,让Alamofire自动兼容JSON或HTML响应:

// 自定义序列化器:先尝试解析JSON,失败则返回HTML字符串
class JSONOrHTMLResponseSerializer: ResponseSerializer {
    func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any {
        // 先处理请求层面的错误
        if let requestError = error {
            throw requestError
        }
        
        guard let responseData = data else {
            throw AFError.responseSerializationFailed(reason: .inputDataNil)
        }
        
        // 优先解析JSON
        do {
            return try JSONSerialization.jsonObject(with: responseData, options: [])
        } catch {
            // 解析失败,尝试转成HTML字符串
            guard let htmlString = String(data: responseData, encoding: .utf8) else {
                throw AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: .utf8))
            }
            return htmlString
        }
    }
}

// 使用自定义序列化器发起请求
Alamofire.request(absolutePath(forApi: functionName), method: apiMethod, parameters: parameters)
    .response(using: JSONOrHTMLResponseSerializer()) { response in
        switch response.result {
        case .success(let result):
            if let json = result as? [String: Any] {
                // 处理正常JSON响应
            } else if let htmlError = result as? String {
                // 处理HTML格式的错误响应
                print("错误详情: \(htmlError)")
            }
        case .failure(let error):
            print("请求错误: \(error)")
        }
    }

额外提示

如果HTML里有结构化的错误信息(比如特定div标签里的提示),可以用SwiftSoup这类HTML解析库精准提取内容,比直接打印整个HTML要友好得多。

内容的提问来源于stack exchange,提问作者TechChain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:36