首页 > 解决方案 > 我使用了alamofire,但结果不同

问题描述

我将值放在我的 url 中,并在请求时获取 true 或 false 文本的值。

func getHistoryCheck() {
    let urlString = "http://myphpfile.php?value1=" + value1 + "&value2=" + value2
    print(urlString)
    
    if let encoded = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let myURL = URL(string: encoded) {
        AF.request(myURL, method: .get).responseJSON { (myresponse) in
            switch myresponse.result {
            case .success:
                print("myresponse: ")
                print(myresponse)
                
            case .failure:
                print("Error")
            }
        }
    }
}

但是当我输入请求值时,这些结果就出来了。

myresponse: 
success(0)

我请求的值的结果应该是错误的。

但是,success(0) 出来了。

成功(0)是什么意思?

++ 我的 php 文件。

<?php

require_once 'connect.php';

$value1 = $_GET['value1'];
$value2 = $_GET['value2'];
$query = "SELECT EXISTS(SELECT id, name FROM nametable
WHERE id='$value1' AND name='$value2');";
$result = mysqli_query($con, $query);

if(!$result) {
    echo 'query error';
} else {
    $row = mysqli_fetch_row($result);
    if($row[0] == 0) {
        echo 'false';
    } else {
        echo 'true';
    }
}

mysqli_close($con);
?>

标签: swiftalamofire

解决方案


我建议不要使用查询参数手动构建 URL,而是让 Alamofire 为您执行此操作。我建议检索与.successand相关的值.failure

func getHistoryCheck(value1: String, value2: String) {
    let parameters = [
        "value1": value1,
        "value2": value2
    ]

    AF.request(url, parameters: parameters)
        .validate()
        .responseJSON { response in
            switch response.result {
            case .success(let value):
                print("value:", value)

            case .failure(let error):
                if let data = response.data, let string = String(data: data, encoding: .utf8) {
                    print(string) // sometimes, if there is a server error, the HTML contains useful diagnostic info
                }
                print(error)
            }
        }
}

顺便说一句,我要补充validate一点,以便它将非 2xx 状态代码作为错误捕获。


在 PHP 方面,我建议将值绑定到?占位符以避免 SQL 注入攻击。

<?php

// https://stackoverflow.com/q/64761452/1271826

header('Content-type: application/json');

$value1 = $_REQUEST["value1"];
$value2 = $_REQUEST["value2"];

if (!(isset($value1) && isset($value2))) {
    http_response_code(422);
    $response = array("success" => false, "message" => "'value1' and 'value2' are required.");
    echo json_encode($response);
    exit();
}

$mysqli = new mysqli("localhost", "...", "...", "...");

// check connection 

if ($mysqli->connect_errno) {
    http_response_code(500);
    $response = array("success" => false, "message" => $mysqli->connect_error, "sqlerrno" => $mysqli->connect_errno);
    echo json_encode($response);
    exit();
}

// perform the SELECT

$sql = "SELECT EXISTS(SELECT id, name FROM nametable WHERE id=? AND name=?);";

$stmt = $mysqli->prepare($sql);
if (!$stmt) {
    http_response_code(500);
    $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate);
    echo json_encode($response);
    $mysqli->close();
    exit();
}

if (!$stmt->bind_param("ss", $value1, $value2)) {
    http_response_code(500);
    $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate);
    echo json_encode($response);
    $mysqli->close();
    exit();
}

if (!$stmt->execute()) {
    http_response_code(500);
    $response = array("success" => false, "message" => $mysqli->error, "sqlerrno" => $mysqli->errno, "sqlstate" => $mysqli->sqlstate);
} else {
    $stmt->bind_result($exists);
    $stmt->fetch();
    $response = array("success" => true, "exists" => boolval($exists));
}

$stmt->close();
$mysqli->close();

echo json_encode($response);

?>

我个人确保我的响应是 JSON 字典,以便我可以解析结果以获取有意义的错误消息,例如

struct Response: Codable {
    let success: Bool
    let exists: Bool
}

然后使用responseDecodable而不是responseJSON


func getHistoryCheck(value1: String, value2: String) {
    let parameters = [
        "value1": value1,
        "value2": value2
    ]

    AF.request(url, parameters: parameters)
        .validate()
        .responseDecodable(of: Response.self, decoder: JSONDecoder()) { response in
            switch response.result {
            case .success(let value):
                if value.exists {
                    ...
                } else {
                    ...
                }

            case .failure(let error):
                if let data = response.data, let string = String(data: data, encoding: .utf8) {
                    print(string) // if there is a server error, the JSON (or even HTML, in some cases) contains useful diagnostic info
                }
                print(error)
            }
        }
}

推荐阅读