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

Swift向PHP服务器发送POST请求,数据解析格式异常求助

Swift POST请求PHP接收异常的解决方法

方案1:改成PHP默认支持的表单请求格式

PHP默认只自动解析application/x-www-form-urlencoded类型的POST数据到$_POST数组。你当前发送的是JSON格式,但未配置正确的请求头和编码方式,导致PHP解析异常。修改Swift代码如下:

struct TestResponse: Codable{
    let test: String
}

func postData<T:Codable>(parameters: T, completion: @escaping (Data?, URLResponse?, Error?) -> Void) {
    guard let url = URL(string: "http://example.com") else {
        completion(nil, nil, NSError(domain: "无效URL", code: -1, userInfo: nil))
        return
    }
    
    var request = URLRequest(url: url)
    request.addValue("XMLHttpRequest", forHTTPHeaderField: "X-Requested-With")
    // 关键:设置表单请求的Content-Type
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    
    do {
        // 将Codable参数转为字典,再编码为表单格式
        let jsonData = try JSONEncoder().encode(parameters)
        guard let paramsDict = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any] else {
            completion(nil, nil, NSError(domain: "参数格式错误", code: -2, userInfo: nil))
            return
        }
        
        let formString = paramsDict.map {
            "\($0.key)=\($0.value)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        }.joined(separator: "&")
        request.httpBody = formString.data(using: .utf8)
    } catch {
        completion(nil, nil, error)
        return
    }
    
    URLSession.shared.dataTask(with: request, completionHandler: completion).resume()
}

// 调用示例
let testParams = TestResponse(test: "string with space")
postData(parameters: testParams) { data, response, error in
    // 处理回调逻辑
}

修改后,PHP端可直接通过$_POST['test']获取对应值。

方案2:PHP直接读取JSON请求体

如果想保留Swift发送JSON的方式,PHP需要手动读取原始请求体并解析:

// 读取原始POST请求数据
$rawPostData = file_get_contents('php://input');
// 解析为关联数组
$requestData = json_decode($rawPostData, true);

// 使用示例
if (isset($requestData['test'])) {
    echo $requestData['test']; // 输出:string with space
}

问题原因

  • 你的Swift代码未设置Content-Type: application/json请求头,PHP无法识别请求体为JSON格式
  • 即使设置了正确的Content-Type,PHP默认也不会将JSON数据解析到$_POST数组,只会把未识别格式的请求体当作键存入$_POST(对应值为空)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:35:00