Отправка HTTP пост-запроса из Swift в базу данных mysql

Я создаю систему регистрации (получая информацию о пользователях, такую ​​как имя, адрес электронной почты), используя 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()
}

1

Решение

Так как вы получаете ошибку 400 «отсутствует необходимая информация», проблема заключается не в возможности сохранить информацию в базе данных, а в получении значений из запроса POST (запускается этой строкой):

if (empty ($ _ REQUEST [«userEmail»]) || empty ($ _ REQUEST [«userPassword»]) || empty ($ _ REQUEST [«userFirstName»]) || empty ($ _ REQUEST [«userLastName»])))

Я бы начал с распечатки этих значений. Кто-нибудь из них появляется? только один пустой? Если они все пусты, проблема в том, как вы отправили параметры из внешнего интерфейса.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector