【问题标题】:JSON data not parsing using with Alamofire in swift3JSON数据未在swift3中使用Alamofire进行解析
【发布时间】:2018-01-10 06:09:29
【问题描述】:

我必须使用 alamofire 解析 json 在使用 json 会话之前,它从 json 获取数据工作正常。现在我尝试使用 alamofire 解析 json。 这是使用 json 解析 json 的代码,这段代码工作正常

func auth(_ email:String,password:String) {

     var request = URLRequest(url:AppConstants.apiURLWithPathComponents("usersignin"))
        let session = URLSession.shared

        request.httpMethod = "POST"

        let bodyData = "email=\(email)&passCode=\(password)&deviceType=iOS&deviceId=\(deviceToken)"

        request.httpBody = bodyData.data(using: String.Encoding.utf8);
        let task = session.dataTask(with: request, completionHandler: { (data, response, error) in

            do {

                if data != nil {

                    if let jsonData = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary {

                        errorCode = String(describing: jsonData["errorCode"]!)

                        msg = jsonData["msg"] as! String

                        print(errorCode)

                        print(jsonData)

                        if(errorCode == "1"){

                            DispatchQueue.main.async(execute: {

                                self.activityIndicator.stopAnimating()

                            })

                        } else {

                            self.name = jsonData.value(forKey: "name") as! String

                            if let kidsURLDetails = jsonData["kidsURLDetails"] as? NSArray {

                                for i in 0 ..< kidsURLDetails.count {

                                    if kidsURLDetails[i] is NSDictionary {

                                        let url = kidsURLDetails[i] as? NSDictionary

                                        self.urls.append((url?["url"]) as! String)
                                    }
                                }
                            }

                            self.serverURL = self.urls.joined(separator: ",")
                            print("ServerURL \(self.serverURL)")
                            let prefs:UserDefaults = UserDefaults.standard
                            prefs.setValue(self.name, forKey: "NAME")

                            DispatchQueue.main.async(execute: {
                                UIApplication.shared.endIgnoringInteractionEvents()
                                let controllerId = "NavID"
                                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                                let initViewController: UIViewController = storyboard.instantiateViewController(withIdentifier: controllerId) as UIViewController
                                self.present(initViewController, animated: true, completion: nil)

                            })
                        }
                    }
                } else {

                }

            } catch let err as NSError {

                print("JSON Error \(err)")
            }

        })

        task.resume()
    }

在上面的代码中,我使用了传递参数的 post 方法,当我尝试在 almofire 中传递参数的 post 方法时出现错误 “Extra argument 'method' in call”,用户名和密码来自文本字段,因此在输入电子邮件和密码后,我使用 post 方法传递了参数。

这是我将在 alamofire json 解析中实现的代码

 var request = URLRequest(url:AppConstants.apiURLWithPathComponents("usersignin"))


        let bodyData = "email=\(username)&passCode=\(passcode)&deviceType=iOS&deviceId=123456"

        let deviceId = "1234"

        let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
        Alamofire.request(request, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
            .responseJSON { response in

                print(response.result.value as Any)  }

如果我可以尝试这段代码工作

Alamofire.request("http://www.kids.com/rk/api/usersignin?email=demo@kidsapp.com&passCode=123456&deviceType=&deviceId=", method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
            .responseJSON { response in

                print(response.result.value as Any)          }

如何使用 alamofire 解析 json post 方法传递参数。我在哪里做错了请帮助我

【问题讨论】:

    标签: ios json swift alamofire


    【解决方案1】:

    您在调用的 1 个参数中传递了错误的类型,它应该是 URLConvertible(字符串或 URL)而不是 URLRequest。试试下面的代码。

    let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
    let url = URL(string: "http://www.kids.com/rk/api/usersignin")!
    Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
        .responseJSON { response in
    
    }
    

    ____________编辑___________

    这里 header 是发布请求标头(如果有)或无

    let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
    
    let urlString = "http://www.kids.com/rk/api/usersignin"
    guard let url = URL(string: urlString), var request = try? URLRequest(url: url, method: .post, headers: header) else{
        //
        return
    }
    
    request.httpBody = params.map{ "\($0)=\($1)" }.joined(separator: "&").data(using: .utf8)
    Alamofire.request(request).responseJSON { response in
    
    }
    

    【讨论】:

    • 谢谢兄弟,我想像这样传递参数 email=demo@kidsaapp.com&passCode=123456&deviceType=IOS&deviceId=12345 但是当打印时让参数:[String: Any] = ["email" : username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId] ,print(params) 显示反转格式,如 params ["deviceId": "1234", "email": "demo@ kidsaapp.com", "deviceType": "IOS", "passCode": "123456"]
    • 格式以不同的方式显示 params ["deviceId": "1234", "email": "demo@kidsaapp.com", "deviceType": "IOS", "passCode": "123456" ]
    • 好的,检查我更新的答案。和参数顺序无关紧要。
    • guard let url = URL(string: urlString), var request = try? URLRequest(url: url, method: .post, headers: header) else{ return } request.httpBody = params.map{ "($0)=($1)" }.joined(separator: "&").data(使用: .utf8) 你能解释一下这个我不明白吗?我们必须改变它,我们可以在编辑代码之前直接调用
    • //guard let url = URL(string: urlString), var request = try? URLRequest(url: url, method: .post, headers: header) 这一行首先创建 url 然后 urlrequest (使用 gaurd 安全地解开可选值),如果 url 或 urlrequest 为 nil 则它将执行 else 阻塞并返回。 //parameters.map{ "($0)=($1)" }.joined(separator: "&") 这一行将参数转换为查询字符串,例如 email=demo@kidsapp.com&passCode=123456... // 数据(使用: .utf8) 将字符串转换为数据对象并分配给 httpBody
    【解决方案2】:

    如果您需要在 url 中通过 post 请求发送参数,您应该使用 URLEncoding.default 编码而不是 JSONEncoding.default。当您需要将 JSON 数据作为内容类型为 application/json 的正文发送时,使用 JSONEncoding。

    更改您的代码,如:

    Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { response in
        print(response.result.value as Any)  
    }
    

    或者您可以删除编码参数,因为URLEncoding是Alamofire的默认编码。

    【讨论】:

    • 我尝试了上面的代码,它得到了这个错误 Extra argument 'method' in call at .post location
    • @naga 将URLRequest 更改为网址。
    • 格式以不同的方式显示 params ["deviceId": "1234", "email": "demo@kidsaapp.com", "deviceType": "IOS", "passCode": "123456" ]
    • @naga 这很好,Alamofire 的URLEncoding 会将此字典转换为deviceId=1234&amp;email=demo@kidsaapp.com&amp;deviceType=IOS&amp;passCode=123456,这就是我们必须使用URLEncoding 的原因。
    • 对不起兄弟它不工作这是我的 api rakshakids.com/dev/rkmain/api/… 在点击状态为 {"errorCode":"0","msg":"Success","name":"Demo Father" ,"kidsURLDetails":[{"schoolId":"17","db":"dev_demoschool","url":"https:\/\/www.rakshakids.com\/dev\/sales"}]}
    【解决方案3】:
     // URL
        let urlString = “URL_Here”
    
        var params = [String: Any]()
    
        //Contruct your params
        params = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
    
        // Request
        Alamofire.request(urlString, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
            .validate(statusCode: 200..<300)
            .responseJSON { response in
                if (response.result.error == nil) {
                  let value = response.result.value
                    print(value)
                }
                else {
                    let errorString = response.result.error
                    print(errorString)
                }
        }
    

    【讨论】:

    • 格式以不同的方式显示 params ["deviceId": "1234", "email": "demo@kidsaapp.com", "deviceType": "IOS", "passCode": "123456" ] 不正确
    • 没关系,它是一个“键值”对对象
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多