Alamofire传递Integer参数时遇必填参数缺失问题求助
解决参数缺失问题:Swift Alamofire与PHP后端的参数传递不匹配
首先,你的核心问题在于请求编码格式不匹配:
你在Swift中使用了JSONEncoding.default来发送请求,这会把参数放在请求体的JSON结构里,但你的PHP脚本是通过$_POST/$_REQUEST来获取参数的——而PHP的$_POST只处理application/x-www-form-urlencoded或multipart/form-data格式的请求,无法直接读取JSON格式的参数,所以才会返回"Required parameters are missing"。
解决方案1:修改Swift请求的编码方式(推荐,适配现有PHP脚本)
把Alamofire请求的encoding从JSONEncoding.default改成URLEncoding.default,这样参数会以表单编码形式发送,PHP的$_POST就能正常读取到:
@IBAction func buttonRegister(_ sender: UIButton) { let ageINT = Int(ageTF.text!); //creating parameters for the post request let parameters: Parameters=[ "name":nameTF.text!, "username":usernameTF.text!, "age": ageINT ?? 0, "country":countryTF.text!, "password":passwordTF.text!, ] //Sending http post request Alamofire.request(URL_USER_REGISTER, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { response in //printing response print(response) //getting the json value from the server if let result = response.result.value { //converting it as NSDictionary let jsonData = result as! NSDictionary //displaying the message in label self.labelMessage.text = jsonData.value(forKey: "message") as! String? } } }
解决方案2:修改PHP脚本以支持JSON请求(如果需要保留JSON编码)
如果你想继续使用JSON编码发送请求,需要修改PHP脚本,从php://input读取JSON数据并解析:
<?php //importing required script require_once '../includes/DbOperation.php'; $response = array(); // 读取并解析JSON请求体 $request_body = file_get_contents('php://input'); $request_params = json_decode($request_body, true); // 如果解析失败,回退到$_REQUEST(兼容旧请求) if ($request_params === null) { $request_params = $_REQUEST; } if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 修改verifyRequiredParams函数的参数为解析后的请求参数 if (!verifyRequiredParams(array('name', 'username', 'age', 'country', 'password'), $request_params)) { //getting values $name = $request_params["name"]; $username = $request_params["username"]; $age = $request_params["age"]; $country = $request_params["country"]; $password = $request_params["password"]; //creating db operation object $db = new DbOperation(); //adding user to database $result = $db->createUser($name, $username, $age, $country, $password); //making the response accordingly if ($result == USER_CREATED) { $response['error'] = false; $response['message'] = 'User created successfully'; } elseif ($result == USER_ALREADY_EXIST) { $response['error'] = true; $response['message'] = 'User already exist'; } elseif ($result == USER_NOT_CREATED) { $response['error'] = true; $response['message'] = 'Some error occurred'; } } else { $response['error'] = true; $response['message'] = 'Required parameters are missing'; } } else { $response['error'] = true; $response['message'] = 'Invalid request'; } // 修改验证函数,接收请求参数作为参数 function verifyRequiredParams($required_fields, $request_params) { //Looping through all the parameters foreach ($required_fields as $field) { //if any requred parameter is missing if (!isset($request_params[$field]) || strlen(trim($request_params[$field])) <= 0) { //returning true; return true; } } return false; } print_r(json_encode($response)); ?>
额外的小bug修复
在你的DbOperation.php中,密码处理部分有个变量名错误:
$password = md5($pass); // 这里$pass是未定义的变量,应该是$password
需要改成:
$password = md5($password);
否则会导致密码存储错误,后续登录也会失败。
内容的提问来源于stack exchange,提问作者Alex Sasha
相关产品推荐
相关产品推荐

