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字符串被错误拆解为键值对,引发格式混乱和数据丢失。
修复步骤
- Swift端添加请求头:
明确告知服务器请求体为JSON格式:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
- 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
相关产品推荐
相关产品推荐

