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

Swift使用DataTask向PHP发送POST数据损坏,该如何修复?

Swift POST请求数据与服务器接收不一致问题排查

你在Swift应用中发送POST请求到PHP服务器时,服务器接收的数据格式混乱,部分字段被解析为键名,同时存在数据丢失情况。

发送的数据实例

Swift中构造的PostData实例:

PostData(previousVisit: "2024-03-20T10:33:48", lang: "NL", object: "{\"Location\":[\"19\"],\"Event\":[]}", enrolledSince: "{}")

服务器接收的异常数据

PHP端打印的接收结果:

array(1) {
  ["{\"lang\":\"NL\",\"object\":\"{\\\"Location\\\":"]=>
  array(1) {
    ["\\\"19\\\""]=>
    string(0) ""
  }
}

当前发送代码片段

你使用的Swift请求代码:

let url = URL(string: "MyPHPServer.com/script.php")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = try! JSONEncoder().encode(parameters)
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    // 后续处理逻辑
})
task.resume()

问题原因及修复方案

核心问题

你仅设置了httpBody为JSON编码的数据,但未添加Content-Type: application/json请求头。PHP默认会将POST数据按application/x-www-form-urlencoded格式解析,导致JSON字符串被错误拆解为键值对,引发格式混乱和数据丢失。

修复步骤

  1. Swift端添加请求头:
    明确告知服务器请求体为JSON格式:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  1. PHP端正确读取JSON数据:
    PHP不会自动解析application/json类型的请求体,需手动读取原始输入并解析:
$rawInput = file_get_contents('php://input');
$parsedData = json_decode($rawInput, true);
// $parsedData即为完整的解析后数据数组

额外优化建议

  • 替换try!为do-catch处理JSON编码错误,避免崩溃:
do {
    request.httpBody = try JSONEncoder().encode(parameters)
} catch {
    print("JSON编码失败:\(error)")
    return
}
  • 确认PostData模型已正确实现Codable协议,保证字段编码正确:
struct PostData: Codable {
    let previousVisit: String
    let lang: String
    let object: String
    let enrolledSince: String
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:05:37