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

SwiftUI向PHP服务发POST请求,参数无法进入$_POST数组求助

解决SwiftUI POST请求参数无法进入PHP $_POST数组的问题

问题原因

你当前的请求将参数序列化为JSON格式,并设置了Content-Type: application/json,这种情况下PHP不会自动把JSON payload解析到$_POST数组,只能通过file_get_contents('php://input')读取。要让参数进入$_POST,需要改用表单编码格式(application/x-www-form-urlencoded)发送请求。

修改后的SwiftUI代码

将参数转换为URL编码的键值对字符串,同时调整请求头的Content-Type:

guard let url = URL(string: "https://testservice.de/login.php") else {
    print("Error: 无效URL")
    return
}

// 把参数转为URL编码的键值对字符串
let params = [
    "benutzer": "test",
    "passwort": "test"
]
let paramString = params.map { 
    "\($0.key)=\($0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)" 
}
.joined(separator: "&")

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = paramString.data(using: .utf8)
// 设置PHP能自动解析的Content-Type
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
// 若服务端返回JSON则保留Accept头,否则可移除
request.setValue("application/json", forHTTPHeaderField: "Accept")

URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data else {
        print("Error: 无返回数据")
        return
    }
    let responseText = String(data: data, encoding: .utf8) ?? "编码未知"
    print("响应内容: \(responseText)")
}.resume()

关键修改点

  • 替换JSONSerialization为URL编码字符串生成:每个键值对编码后用&连接,确保特殊字符被正确转义
  • 将Content-Type改为application/x-www-form-urlencoded,这是PHP自动解析参数到$_POST的默认表单格式
  • 移除.prettyPrinted选项,表单格式不需要格式化输出

PHP端验证示例

修改后可直接通过$_POST获取参数:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $benutzer = $_POST['benutzer'] ?? '未获取到';
    $passwort = $_POST['passwort'] ?? '未获取到';
    echo "用户名: $benutzer, 密码: $passwort";
}
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:01:00