Search code examples
phpjsonswiftalamofire

Swift send parameters in Alamofire


I want to send two values in the request:

1) operation string

2) user object

I am getting message Operation is not set even though I included in parameters "operation": "register"

I am new to Alamofire. Can anyone explain to me:

1) how to send values in the request?

2) how to send the user object?

3) how to deal with both results .Success and .Failure

Swift Code:

let urlString = URLFactory()
let url = URL(string: urlString.getAppURL())!
print("Log url: \(url)")

let user = User()
user.setEmail(email: email)

let parameters: Parameters = ["operation": "register", "user": user]
Alamofire.request(url, method: .post, parameters: parameters).responseJSON { response in
    print("Log \(response)")
    print("Log response.request: \(response.request)")
    print("Log response.error: \(response.error)")
    print("Log response.data: \(response.data)")
    print("Log response.result: \(response.result)")
}

Swift Output:

Log url: http://192.168.0.101/GeolocationNews/NewsDataCrawler/app.php
Log SUCCESS: {
    message = "Invalid Parameters";
    result = failure;
}
Log response.request: Optional(http://192.168.0.101/GeolocationNews/NewsDataCrawler/app.php)
Log response.error: nil
Log response.data: Optional(51 bytes)
Log response.result: SUCCESS

PHP Code:

$login = new Login();
$fun = new FunctionsValidation();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $data = json_decode(file_get_contents("php://input"));

    if(isset($data->operation)) {
        $operation = $data->operation;
        if(!empty($operation)) {
            if($operation == 'register') {
                echo $login->register($data);
            }
        } else { // if operation is empty
            $response["result"] = "failure";
            $response["message"] = "Operation is empty";
            echo json_encode($response);
        }
    } else { // if operation is not set
        $response["result"] = "failure";
        $response["message"] = "Operation is not set";
        echo json_encode($response);
    }
}

UPDATE

I have tested the API by Postman sending:

{
    "operation": "register",
    "user":
    {
        "email": "email value"
    }
}

It gives me: {"result":"failure","message":"Invalid Email"} so the API is working good!

I have tried sending Alamofire request with just operation in the parameters and it works. So it seems like the problem is in converting the user object to dictionary. Can anyone give me an example of how to do that?

User object:

class User: NSObject {

    private var name: String,
                email: String,
                password: String,
                oldPassword: String,
                newPassword: String,
                code: String
    private var id: Int

    override init() {
        self.name = ""
        self.email = ""
        self.password = ""
        self.oldPassword = ""
        self.newPassword = ""
        self.code = ""
        self.id = 0
    }
    // set and get methods ...
}

Solution

  • The problem was with converting the user object to a dictionary. Instead of using an object, I just set the user as a dictionary.

    let userDictionary: Dictionary = ["email": email, "password": password]
    let parameters: Parameters = ["operation": operation, "user": userDictionary]
    Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in
        ...
    }