在 Alamofire 中 Swift 发送参数

Posted

技术标签:

【中文标题】在 Alamofire 中 Swift 发送参数【英文标题】:Swift send parameters in Alamofire 【发布时间】:2018-02-11 00:52:38 【问题描述】:

我想在请求中发送两个值:

1) 操作字符串

2) 用户对象

我收到消息Operation is not set,即使我包含在参数"operation": "register"

我是 Alamofire 的新手。谁能给我解释一下:

1)如何在请求中发送值?

2)如何发送用户对象?

3)如何处理.Success.Failure这两个结果

Swift 代码:

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)")

快速输出:

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 代码:

$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);
    

更新

我已经通过 Postman 发送测试了 API:


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

它给了我:"result":"failure","message":"Invalid Email" 所以 API 运行良好!

我已经尝试通过参数中的操作发送 Alamofire 请求并且它有效。所以看起来问题在于将用户对象转换为字典。谁能给我一个例子来说明如何做到这一点?

用户对象:

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 ...

【问题讨论】:

你如何解析“用户”。看起来您正在尝试将 User 作为 Swift 对象发送。您可以先通过 REST 客户端测试您的 api,例如邮递员 @RikeshSubedi API 在检查用户之前返回响应。它首先检查操作然后返回"Operation is not set"而不读取用户。所以用户不是这里的问题 - 至少现在 @JumanaAlhaddad 1. 我认为您的 api 有问题 - 请使用邮递员测试您的 api,正文为 "operation": "register" 2. 您需要将 User 对象转换为字典 @AdrianBobrowski 我已经测试了 API,它运行良好!查看我的更新 【参考方案1】:

我认为问题在于编码。根据您的 PHP 代码,它接受 application/json 作为内容类型,这应该通过带有 JSON 编码的 Almofire 发送。

试试这个:

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default)
    .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)")
    

参考: https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#parameter-encoding

【讨论】:

谢谢!你知道如何将用户对象转换为字典的例子吗? @AdrianBobrowski 我在后期更新中添加了我的用户模型 @KundanSinghChouhan 我已经添加了encoding: JSONEncoding.default,但仍然无法正常工作。似乎问题在于在传递用户对象之前将其转换为字典。我的项目中有 SwiftyJSON,但它只是向我展示了如何从 JSON 转换为字典而不是其他方式。 @JumanaAlhaddad 我看到了你的邮递员,let parameters: Parameters = ["operation": "register", "user": ["email": user.email]] 应该足够了【参考方案2】:

问题在于将用户对象转换为字典。我没有使用对象,而是将用户设置为字典。

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
    ...

【讨论】:

以上是关于在 Alamofire 中 Swift 发送参数的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中使用 alamofire 发送 JSON 数组作为参数

使用 swift 在 Alamofire 中发送带有对象数组的 JSON 作为参数

如何在 Swift 中的 Alamofire 中发送 body 参数?

在swift中使用alamofire将参数作为原始数据发送。

如何在 Swift 中使用 Alamofire 将参数作为正文发送到 PUT 方法

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?