解析JSON Swift 2.0

Onichan

我刚刚升级到Swift 2.0,但我的sendRequest功能似乎有问题

Swift 1.2代码(旧代码):

func sendRequest(request: NSURLRequest, completion:(NSData!, NSError!) -> Void) -> () {
    // Create a NSURLSession task
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { (data: NSData!, response: NSURLResponse!, error: NSError!) in
        if error != nil {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                completion(data, error)
            })

            return
        }
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    completion(data, nil)
                } else {
                    var jsonerror:NSError?
                    if let errorDict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error:&jsonerror) as? NSDictionary {
                        let responseError : NSError = NSError(domain: "HTTPHelperError", code: httpResponse.statusCode, userInfo: errorDict as? [NSObject : AnyObject])
                        completion(data, responseError)
                    }
                }
            }
        })
    }

    // start the task
    task.resume()
}

我对Swift 2.0进行了更改,并成功进行了编译而没有错误。但是数据一直在返回Error Code 400 (bad request)

当前代码尝试(Swift 2.0):

这是当前代码(编译,但返回错误400)

func sendRequest(request: NSURLRequest, completion:(NSData!, NSError!) -> Void) -> () {
    // Create a NSURLSession task
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { (data, response, error) in
        if error != nil {
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                completion(data, error)
            })
            return
        }

        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            if let httpResponse = response as? NSHTTPURLResponse {
                if httpResponse.statusCode == 200 {
                    completion(data, nil)
                } else {

                    do {
                        if let errorDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? NSDictionary
                        {
                            let responseError : NSError = NSError(domain: "HTTPHelperError", code: httpResponse.statusCode, userInfo: errorDict as? [NSObject : AnyObject])
                            completion(data, responseError)
                        }
                    } catch let error as NSError {
                        print("error serializing JSON: \(error)")
                        completion(data, error)
                    }
                }
            }
        })
    }

    // start the task
    task.resume()
}

资料来源:我正在学习本教程,但看起来它是为Swift 1.2编写的

编辑:这是buildRequest功能

func buildRequest(path: String!, method: String, authType: HTTPRequestAuthType,
    requestContentType: HTTPRequestContentType = HTTPRequestContentType.HTTPJsonContent, requestBoundary:String = "") -> NSMutableURLRequest {
        // 1. Create the request URL from path
        let requestURL = NSURL(string: "\(HTTPHelper.BASE_URL)/\(path)")
        let request = NSMutableURLRequest(URL: requestURL!)

        // Set HTTP request method and Content-Type
        request.HTTPMethod = method

        // 2. Set the correct Content-Type for the HTTP Request. This will be multipart/form-data for photo upload request and application/json for other requests in this app
        switch requestContentType {
        case .HTTPJsonContent:
            request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        case .HTTPMultipartContent:
            let contentType = "multipart/form-data; boundary=\(requestBoundary)"
            request.addValue(contentType, forHTTPHeaderField: "Content-Type")
        }

        // 3. Set the correct Authorization header.
        switch authType {
        case .HTTPBasicAuth:
            // Set BASIC authentication header
            let basicAuthString = "\(HTTPHelper.API_AUTH_NAME):\(HTTPHelper.API_AUTH_PASSWORD)"
            let utf8str = basicAuthString.dataUsingEncoding(NSUTF8StringEncoding)
            let base64EncodedString = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))

            request.addValue("Basic \(base64EncodedString!)", forHTTPHeaderField: "Authorization")
        case .HTTPTokenAuth:
            // Retrieve Auth_Token from Keychain
            if let userToken = KeychainAccess.passwordForAccount("Auth_Token", service: "KeyChainService") as String? {
                // Set Authorization header
                request.addValue("Token token=\(userToken)", forHTTPHeaderField: "Authorization")
            }
        }

        return request
}
查图兰加席尔瓦

试试这个:-

func sendRequest(request: NSURLRequest, completion:(NSData!, NSError!) -> Void) -> () {
    let request = request
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        let error = error
        let response = response
        let data = data
        if  data != nil && error == nil {
            let res = response as! NSHTTPURLResponse!
            if (res.statusCode >= 200 && res.statusCode < 300) {
               do {
                    let jsonData:AnyObject? = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                     print("Success")
               } catch let error as NSError {
                 print("Failed To load")
               } catch {
               // Something else happened.
              // Insert your domain, code, etc. when constructing the error.
              }
          } else {
              print("Connection Error")
          }

    } else {
        print("Error")
    }
  })
   task.resume()
}

并在您的buildRequest中,使用set:-

 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章