【问题标题】:Error in URL Request "The operation couldn’t be completed. No such file or directory"URL 请求中的错误“操作无法完成。没有这样的文件或目录”
【发布时间】:2016-02-04 04:25:51
【问题描述】:

自从更新到 9.1 后 URL 请求的 Swift 语法发生变化以来,我一直在向我的 API 发出请求时出错。例如,这个 POST 请求只是尝试登录。我可以直接在 API (Strongloop Loopback) Explorer 界面中登录,但不能从 Swift 登录。我收到此错误:

The operation couldn’t be completed. No such file or directory

我的代码如下所示:

func performLoginRequestWithURL(url: NSURL, email: String, password: String) {
            let bodyData = "email=\(email)&password=\(password)"
            let request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
            let session = NSURLSession.sharedSession()
            request.HTTPMethod = "POST"
            request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)

            let task = session.dataTaskWithRequest(request, completionHandler: {
                data, response, error -> Void in
                if let error = error {
                    let errString = error.localizedDescription
                    NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": errString])
                    print(error.localizedDescription)

                } else if data != nil {
                    let json = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String

                    if let dictionary = JSON().parseJSON(json) as [String: AnyObject]? {
                        let accesstoken = dictionary["id"] as! String
                        let id = dictionary["userId"] as! Int

                        // MARK: - Store UID & AccessToken
                        NSUserDefaults.standardUserDefaults().setBool(true, forKey: "userLoggedIn")
                        NSUserDefaults.standardUserDefaults().setInteger(id, forKey: "userId")
                        NSUserDefaults.standardUserDefaults().setObject(accesstoken, forKey: "accessToken")
                        NSUserDefaults.standardUserDefaults().synchronize()
                        NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": "Success"])
                    }
                }

            })
            task.resume()
        }

这是它过去工作时的样子,但他们贬低了 sendAsynchronousRequest 方法:

func performLoginRequestWithURL(url: NSURL, email: String, password: String) {
        let bodyData = "email=\(email)&password=\(password)"
        var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
            response, data, error in

            if let error = error {
                let errString = error.localizedDescription
                NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": errString])

            } else if data != nil {
                let json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String

                if let dictionary = JSON().parseJSON(json) as [String: AnyObject]? {
                    let accesstoken = dictionary["id"] as! String
                    let id = dictionary["userId"] as! Int
                    var results = [String: AnyObject]()
                    results = ["at": accesstoken, "id": id]

                    // MARK: - Store UID & AccessToken
                    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "userLoggedIn")
                    NSUserDefaults.standardUserDefaults().setInteger(id, forKey: "userId")
                    NSUserDefaults.standardUserDefaults().setObject(accesstoken, forKey: "accessToken")
                    NSUserDefaults.standardUserDefaults().synchronize()
                    NSNotificationCenter.defaultCenter().postNotificationName(self.lh, object: nil, userInfo: ["Result": "Success"])
                }
            }

        }
    }

【问题讨论】:

    标签: swift api http-post strongloop loopback


    【解决方案1】:

    原来这个问题与新语法无关,与 iOS 9 以及从模拟器向 localhost 发出请求的方式无关。我能够向我的本地 IP 10.x.x.2 发出请求,但它不再有效,我必须改用 127.0.0.1。这将使通过电话连接时变得困难。我现在每次都得换IP...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2019-04-05
      • 2021-10-31
      相关资源
      最近更新 更多