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

Swift HTTP Post请求返回网站HTML而非JSON响应问题

看起来你的问题出在客户端请求的配置上——毕竟hurl.it能拿到正确响应,说明接口本身是正常的。我帮你梳理几个最可能的原因,以及对应的排查和修复方法:

1. 请求头配置不匹配

很多API会严格校验请求头,比如Content-Type(告诉服务器你发送的数据格式)和Accept(告诉服务器你期望接收的格式)。如果这两个头没设置对,服务器可能会返回HTML页面(比如登录页或者错误页)而不是JSON。

比如如果API期望接收JSON格式的参数,你需要:

  • 设置Content-Type: application/json
  • 设置Accept: application/json
  • 把用户名和密码序列化成JSON字符串作为请求体

如果是表单格式(application/x-www-form-urlencoded),则要对应设置头,并把参数编码成username=xxx&password=xxx的格式。

2. 请求方法错误

确认你代码里用的请求方法(GET/POST/PUT等)和hurl.it里完全一致。比如API要求POST,你却用了GET,服务器很可能返回错误页面。

3. 参数编码或格式错误

如果是POST请求,参数的格式必须和API要求的一致:

  • JSON格式:要把[username: "xxx", password: "xxx"]转成JSON数据,而不是直接传字符串
  • 表单格式:要对参数进行URL编码,拼成key=value的字符串

4. User-Agent或其他特殊头缺失

有些网站会校验User-Agent头,如果你的请求用了URLSession的默认User-Agent,可能被服务器识别为非浏览器/非合法客户端,返回HTML。你可以把代码里的User-Agent设置成和hurl.it一样的试试(比如Hurl/1.0)。

5. 重定向处理问题

如果你的请求被服务器重定向(比如3xx状态码),URLSession默认会自动跟随重定向,但有时候重定向后的页面就是HTML登录页。你可以暂时关闭自动重定向,看看原始响应的状态码和头,确认是否有重定向发生:

let config = URLSessionConfiguration.default
config.allowsRedirects = false
let session = URLSession(configuration: config)

参考修复后的代码示例

假设API接收JSON格式的POST请求:

private func uploadToAPI(username: String, password: String) {
    guard let apiUrl = URL(string: "你的接口完整URL") else {
        print("Invalid API URL")
        return
    }
    
    // 构造请求参数
    let loginParams: [String: Any] = [
        "username": username,
        "password": password
    ]
    
    var request = URLRequest(url: apiUrl)
    request.httpMethod = "POST"
    
    // 关键:设置正确的请求头
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    // 可选:匹配hurl.it的User-Agent
    request.setValue("Hurl/1.0", forHTTPHeaderField: "User-Agent")
    
    // 把参数序列化成JSON请求体
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: loginParams)
    } catch {
        print("Failed to serialize parameters: \(error.localizedDescription)")
        return
    }
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        // 先处理请求错误
        if let error = error {
            print("Request failed with error: \(error)")
            return
        }
        
        // 检查响应状态码
        guard let httpResponse = response as? HTTPURLResponse else {
            print("Invalid response received")
            return
        }
        print("Response status code: \(httpResponse.statusCode)")
        
        // 打印原始响应内容,方便排查
        if let data = data, let responseStr = String(data: data, encoding: .utf8) {
            print("Raw response: \(responseStr)")
            
            // 尝试解析JSON
            do {
                let jsonResponse = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                print("Parsed JSON: \(jsonResponse)")
                // 这里可以处理登录凭据有效性逻辑
            } catch {
                print("Failed to parse JSON: \(error)")
                // 如果到这里说明还是返回HTML,继续对比请求头和hurl.it的差异
            }
        }
    }
    
    task.resume()
}

额外排查步骤

  1. 打开hurl.it的请求详情,把所有请求头(包括Host、User-Agent、Content-Type等)复制到你的代码里,确保完全一致
  2. 打印出你代码里的请求的所有头,和hurl.it的对比,找出差异
  3. 检查接口URL是否完全正确(比如有没有漏掉路径、大小写错误等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:28:42