POST-данные через HTTPS на веб-сервер, используя Swift и php - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу отправить данные в текстовом поле через HTTPS на веб-сервер, используя Swift и PHP, и попробовал этот пример Данные POST в метод PHP из Swift , но он не совместим с PHP7.

Теперь это для PHP7 и Swift 4, но я получил пустую запись в базе данных MySql.

Я думаю, что это PHP-файл ...

Использовать Xcode 10.1. Есть ли решение?

Swift:

import UIKit

class MessageViewController: UIViewController {
    @IBOutlet weak var nachricht: UITextField!

    @IBAction func submit(_ sender: Any) {
        let url = NSURL(string: "http://localhost.com") // localhost MAMP - change to point to your database server

        var request = URLRequest(url: url! as URL)
        request.httpMethod = "POST"

        var dataString = "secretWord=???" // starting POST string with a secretWord

        // the POST string has entries separated by &
        dataString = dataString + "&nachricht=\(nachricht.text!)" // add items as name and value

        // convert the post string to utf8 format
        let dataD = dataString.data(using: .utf8) // convert to utf8 string

        do {
            // the upload task, uploadJob, is defined here
            let uploadJob = URLSession.shared.uploadTask(with: request, from: dataD) { data, response, error in
                if error != nil {
                    // display an alert if there is an error inside the DispatchQueue.main.async
                    DispatchQueue.main.async {
                        let alert = UIAlertController(title: "Upload Didn't Work?", message: "Looks like the connection to the server didn't work.  Do you have Internet access?", preferredStyle: .alert)
                        alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
                        self.present(alert, animated: true, completion: nil)
                    }
                } else {
                    if let unwrappedData = data {
                        let returnedData = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue) // Response from web server hosting the database

                        if returnedData == "1" { // insert into database worked
                            // display an alert if no error and database insert worked (return = 1) inside the DispatchQueue.main.async
                            DispatchQueue.main.async {
                                let alert = UIAlertController(title: "Upload OK?", message: "Looks like the upload and insert into the database worked.", preferredStyle: .alert)
                                alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
                                self.present(alert, animated: true, completion: nil)
                            }
                        } else {
                            // display an alert if an error and database insert didn't worked (return != 1) inside the DispatchQueue.main.async
                            DispatchQueue.main.async {
                                let alert = UIAlertController(title: "Upload Didn't Work", message: "Looks like the insert into the database did not worked.", preferredStyle: .alert)
                                alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
                                self.present(alert, animated: true, completion: nil)
                            }
                        }
                    }
                }
            }
            uploadJob.resume()
        }
    }
}

Файл PHP:

<?php
$secret = $_POST["secretWord"];
if ("???" != $secret) exit; // note the same secret as the app - could be let out if this check is not required. secretWord is not entered by the user and is used to prevent unauthorized access to the database

$nachricht = $_POST['nachricht'];


// POST items should be checked for bad information before being added to the database.

// Create connection
$mysqli=mysqli_connect("localhost","db","db_pass","db_usr"); // localhost, user name, user password, database name

// Check connection
if (mysqli_connect_errno())
{
    echo "
    Failed to connect to MySQL: " . mysqli_connect_error();
}

$query = "insert into `db` (nachricht) value ('".$nachricht."')";
$result = mysqli_query($mysqli,$query);

echo $result; // sends 1 if insert worked
?>

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Это из Xcode: [MC] Чтение из личных действующих пользовательских настроек.Ответ сеанса: {URL: https://localhost.com/api.php} {Код состояния: 200, Заголовки {Connection = («Keep-Alive»);"Content-Encoding" = (gzip);«Длина содержимого» = (21);"Content-Type" = ("text / html; charset = UTF-8");Дата = («Солнце, 02 декабря 2018 10:06:45 по Гринвичу»);"Keep-Alive" = ("тайм-аут = 5, макс = 100");Сервер = (Apache);"Strict-Transport-Security" = ("max-age = 31556926");Vary = ("Принять-кодирование");}} 2018-12-02 11: 10: 36.854962 + 0100 Localhost [2289: 36190] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C1.1: 2] [0x7f8f76f215b0] получить выходные кадры не удалось, состояние 8196

В базе данных MySql отсутствует запись из текстового поля.

0 голосов
/ 28 ноября 2018

У меня мало информации о PHP-части вашей проблемы.Но я бы порекомендовал вам попробовать использовать "https://github.com/Alamofire/Alamofire" для всех ваших сетевых потребностей, поскольку он поддерживает Swift 4 с PHP7. Это также уменьшает количество строк кода, которые вам нужно написать.

То же самое с AlamofireВаш POST-запрос будет выглядеть примерно так.

import UIKit
import Alamofire

class MessageViewController: UIViewController {
@IBOutlet weak var nachricht: UITextField!

@IBAction func submit(_ sender: Any) {
    let body: Parameters = [
        "secretWord":"???",
        "nachricht":"\(nachricht.text!)",
    ]

    Alamofire.request("http://localhost.com", method: .post, parameters: body, encoding: JSONEncoding.default).responseJSON { response in

        print("Your response from server is: \(response)")

    }
  }
}

Надеюсь, что это решит Swift часть вашей проблемы.

РЕДАКТИРОВАТЬ: По запросу здесь обновление. Я выполнил ваш запрос без использованиясетевой менеджер (Alamofire)

import UIKit

class MessageViewController: UIViewController {
@IBOutlet weak var nachricht: UITextField!

@IBAction func submit(_ sender: Any) {
    // MARK: Preparing json data
    let parameters: [String: Any] = [
        "secretWord":"???",
        "nachricht":"\(nachricht.text!)",
    ]

    //Serialise Parameters to JSON data.
    let jsonData = try? JSONSerialization.data(withJSONObject: parameters)

    // create post request
    let url = URL(string: "http://localhost.com")!
    var request = URLRequest(url: url)
    request.httpMethod = "POST"

    // insert json data to the request
    request.httpBody = jsonData

    let task = URLSession.shared.dataTask(with: request) { data, response, error in

        print("Session Response: \(String(describing: response!))")

        let httpResponse = response as? HTTPURLResponse
        let statusCode = httpResponse?.statusCode
        if statusCode == 404 {
            DispatchQueue.main.async {
                // create the alert
                let alert = UIAlertController(title: "Server not available", message: "Try again later.", preferredStyle: UIAlertController.Style.alert)

                // add an action (button)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil))

                // show the alert
                self.present(alert, animated: true, completion: nil)
            }
        }else{

            guard let data = data, error == nil else {
                print(error?.localizedDescription ?? "No data")
                return
            }

            let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
            if let responseJSON = responseJSON as? [String: Any] {

                print("Your response from server is: \(responseJSON)")
            }
        }
    }
    task.resume()
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...