首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alamofire http post -注册用户Swift 3

Alamofire http post -注册用户Swift 3
EN

Stack Overflow用户
提问于 2016-11-11 01:54:39
回答 3查看 3.3K关注 0票数 2

快速问题:我正在使用Alamofire库在我的数据库中注册一个用户。我从后端开发人员那里获得了端点和参数,并亲自在Postman中对其进行了测试,数据通过得很好。我正在我的寄存器视图控制器中实现它,但一直没有得到响应。下面是我的实现。仅供参考:我离开了视图控制器的用户类型。最终用户不应该知道他们是用户类型3。我可能在这里做错了什么。我在输出中没有得到任何响应。

代码语言:javascript
复制
let params = ["username":usernameField.text!,
                  "firstname":firstNameField.text!,
                  "lastname":lastNameField.text!,
                  "password":passwordField.text!,
                  "usertype":"3",
                  "email":emailAddressField.text!
    ]

    let apiMethod = "http://api.example.com"

    Alamofire.request(apiMethod, method: .post, parameters: params, encoding: URLEncoding.default).responseString { (response) in

        print(response);

        let alertController = UIAlertController(title: "REGISTRATION SUCCESSFUL!", message: nil, preferredStyle: .alert);

        alertController.addAction(UIAlertAction(title: "OK", style: .default,handler: nil));

        self.present(alertController, animated: true, completion: nil)

    }



}

       if let json = response.result.value as? Dictionary<String, String> {
           print ("JSON: \(json)")
           if (json["register_status"]! == "userExist") {
                return
        } else {
                self.performSegue(withIdentifier: "registerSuccess", sender: self)
           }
          }

一旦用户正确注册,我的响应应该是:

代码语言:javascript
复制
{
  "username": "userregister",
  "register_status": "RegistrationComplete",
  "register_date": "11/10/2016"
}

但如果用户存在,我将得到以下消息:

代码语言:javascript
复制
{
  "username": "userregister",
  "register_status": "userExist",
  "register_date": "11/10/2016"
}

我在我的Swift 3代码中做错了什么?

编辑(添加寄存器视图控制器)以保持清晰:

EN

回答 3

Stack Overflow用户

发布于 2016-11-11 03:08:46

如果您的响应是JSON,我会这样做。这将帮助您调试代码。另外,我建议你在控制台中设置断点并检查响应。

代码语言:javascript
复制
Alamofire.request(apiMethod, method: .post, parameters: params, encoding: URLEncoding.default).responseJSON {response in
    var err:Error?
    switch response.result {
    case .success(let json):
         print(json)
          // update UI on main thread
         DispatchQueue.main.async {
                let alertController = UIAlertController(title: "REGISTRATION SUCCESSFUL!", message: nil, preferredStyle: .alert);

                alertController.addAction(UIAlertAction(title: "OK", style: .default,handler: nil));

                self.present(alertController, animated: true, completion: nil)
        } 
    case .failure(let error):
         err = error
         print(err)
    }
}

如果这对您没有帮助,请分享您的rest客户端请求有效负载,以便我可以进一步帮助您。

票数 1
EN

Stack Overflow用户

发布于 2016-11-11 03:01:42

您的回调是在另一个线程上进行的,因此您需要将警报控制器表示调用包装在DispatchQueue.main.async块中,因为所有ui都需要发生在主线程上,否则可能会出现奇怪的绘图/计时错误。

无论如何,这可能不是你的请求的问题。您正在发出http请求,从iOS 9开始,该请求在默认情况下被禁用。您需要在info.plist文件中显式设置应用传输安全密钥。你可以在苹果的documentation中看到这些值。我猜你可能同时想要NSAllowsArbitraryLoads和NSExceptionAllowsInsecureHTTPLoads。

票数 0
EN

Stack Overflow用户

发布于 2016-11-12 02:17:31

感谢你昨天在@hacker_1989 @Josh @Aaron上的帮助。我对使用Alamofire Library和Swift 3语言的用户注册的解决方案如下:

代码语言:javascript
复制
@IBAction func registerTappedButton(_ sender: Any) {
    if(userNameField.text == nil || (userNameField.text?.isEmpty)!) {
        self.showAlertError("Username required", message: "")
        return
    }
    if(firsNameField.text == nil || (firsNameField.text?.isEmpty)!) {
        self.showAlertError("First Name required", message: "")
        return

    }
    if(lastNameField.text == nil || (lastNameField.text?.isEmpty)!) {
        self.showAlertError("Last Name required", message: "")
        return
    }
    if(passwordField.text == nil || (passwordField.text?.isEmpty)!) {
        self.showAlertError("Password required", message: "")
        return
    }
    if(emailAddressField.text == nil || (emailAddressField.text?.isEmpty)!) {
        self.showAlertError("Email Address required", message: "")
    }

    let params = ["username": userNameField.text!,
                  "firstname": firsNameField.text!,
                  "lastname": lastNameField.text!,
                  "password": passwordField.text!,
                  "usertype": 3,
                  "email": emailAddressField.text!] as [String : Any]

    let apiMethod = "http://api.example.com" //<-Set your endpoint here

    Alamofire.request(apiMethod, method: .post, parameters: params, encoding: JSONEncoding.default).responseString { (response) in

        print(response);

        let alertController = UIAlertController(title: "REGISTRATION SUCCESSFUL!", message: nil, preferredStyle: .alert);

        alertController.addAction(UIAlertAction(title: "OK", style: .default,handler: nil));



        self.present(alertController, animated: true, completion: nil)

    }


}

后端开发人员将终结点更改为期望JSON对象。他之前曾将端点设置为期望URL编码的参数。

现在一切都很好。数据正在成功传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40534102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档