Я создаю систему регистрации (получая информацию о пользователях, такую как имя, адрес электронной почты), используя Swift в качестве внешнего интерфейса, php в качестве внутреннего и mysql в качестве базы данных. (используя мой собственный сервер, а не localhost) и пытаясь отправить HTTP-запрос от Swift для вставки данных в пользовательские таблицы. (mySQL). Я использую безопасный https URL.
Проблема в том, что когда я пытаюсь передать данные (имя, фамилию, адрес электронной почты, пароль), я всегда получаю неверный запрос (400) «Отсутствует необходимая информация», например, на снимке экрана, и не может позволить пользователям зарегистрироваться… введите описание изображения здесь
Если бы я мог передать данные, я должен получить ответ об успешном завершении (200) «Регистрация прошла успешно».
Вызвана функция внутри php, поэтому я предполагаю, что в моем php-коде нет ничего плохого, кроме кода Swift.
Я хочу знать причину, по которой я не могу передать данные на свой сервер (возможно, из настроек MySQL?).
Заранее спасибо и счастливого кодирования!
Мой php файл (имя файла: registerUser.php):
<?php
require("Conn.php");
require("MySQLDAO.php");
$returnValue = array();
if(empty($_REQUEST["userEmail"]) || empty($_REQUEST["userPassword"]) || empty($_REQUEST["userFirstName"]) || empty($_REQUEST["userLastName"]))
{
$returnValue["status"]="400";
$returnValue["message"]="Missing required information";
echo json_encode($returnValue);
return;
}
$userEmail = htmlentities($_REQUEST["userEmail"]);
$userPassword = htmlentities($_REQUEST["userPassword"]);
$userFirstName = htmlentities($_REQUEST["userFirstName"]);
$userLastName = htmlentities($_REQUEST["userLastName"]);
//generate secured passowrd
$salt = openssl_random_pseudo/bytes(16);
$secured_password = sha1($userPassword . $salt);
$dao = new MySQLDAO(Conn::$dbhost, Conn::$dbuser, Conn::$dbpassword, Conn::$dbname);
$dao->openConnection();
//check if user with provided username is available
$userDetails = $dao->getUserDetails($userEmail);
if (!empty($userDetails))
{
$returnValue["status"]="400";
$returnValue["message"]="Please choose a different email address";
echo json_encode($returnValue);
return;
}
//Register new User
$result = $dao->registerUser($userEmail, $userFirstName, $userLastName, $secured_password, $salt);
if($result){
$userDetails = $dao->getUserDetails($userEmail);
$returnValue["status"] = "200";
$returnValue["message"] = "Registration successful";
$returnValue["userId"] = $userDetails["user_id"];
$returnValue["userFirstName"] = $userDetails["first_name"];
$returnValue["userLastName"] = $userDetails["last_name"];
$returnValue["userEmail"] = $userDetails["email"];
} else {
$returnValue["status"]="400";
$returnValue["message"]="Couldn't register";
}
$dao->closeConnection();
echo json_encode($returnValue);
?>
Мой код Swift:
lazy var submitButton: UIButton = {
let button = UIButton(type: .system)
button.backgroundColor = UIColor(red:0.09, green:0.51, blue:0.92, alpha:1.0)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Signup", for: .normal)
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action: #selector(handleSubmit), for: .touchUpInside)
return button
}()
func handleSubmit() {
guard let userFirstName = userFirstNameTextField.text, let userLastName = userLastNameTextField.text, let userEmail = emailTextField.text, let userPassword = passwordTextField.text, let repeatPassword = repeatPasswordTextField.text
else {
print("Form is not valid")
return
}
if (userPassword != repeatPassword) {
self.displayAlertMessage(userMessage: "Passwords do not match")
return
}
if (userFirstName.isEmpty || userLastName.isEmpty || userEmail.isEmpty || userPassword.isEmpty) {
self.displayAlertMessage(userMessage: "All fields are required")
return
}
let myUrl = NSURL(string: "https://my URL name/registerUser.php")
let request = NSMutableURLRequest(url: myUrl! as URL)
request.httpMethod = "POST"request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let postString = "userEmail=\(userEmail)&userFirstName=\(userFirstName)&userLastName=\(userLastName)&userPassword=\(userPassword)"
request.httpBody = postString.data(using: String.Encoding.utf8)
let task = URLSession.shared.dataTask(with: request as URLRequest) {(data:Data?, response:URLResponse?, error: Error?) -> Void in
DispatchQueue.main.async {
if error != nil {
self.displayAlertMessage(userMessage: "Error")
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
let userId = parseJSON["userId"] as? String
if (userId != nil) {
let myAlert = UIAlertController(title: "Success", message: "Registration Successful", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
myAlert.addAction(okAction)
self.present(myAlert, animated: true, completion: nil)
} else {
print(123)
let errorMessage = parseJSON["message"] as? String
if (errorMessage != nil) {
self.displayAlertMessage(userMessage: errorMessage!)
}
}
}
} catch {
print(error)
}
}
}
task.resume()
}
Так как вы получаете ошибку 400 «отсутствует необходимая информация», проблема заключается не в возможности сохранить информацию в базе данных, а в получении значений из запроса POST (запускается этой строкой):
if (empty ($ _ REQUEST [«userEmail»]) || empty ($ _ REQUEST [«userPassword»]) || empty ($ _ REQUEST [«userFirstName»]) || empty ($ _ REQUEST [«userLastName»])))
Я бы начал с распечатки этих значений. Кто-нибудь из них появляется? только один пустой? Если они все пусты, проблема в том, как вы отправили параметры из внешнего интерфейса.
Других решений пока нет …