休息json POST错误在Swift 2中处理

时间:2015-09-26 07:08:39

标签: ios json swift rest

一个新的swift 2,我尝试在Swift 2中编写一个发出HTTP POST请求的应用程序,但我无法弄清楚如何使用do try catch方法使用Swift 2.am的新错误处理但仍然错误显示 “由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'*** + [NSJSONSerialization dataWithJSONObject:options:error:]:JSON写入中的顶级类型无效”

这里的代码适用于swift 1.2

//Post request to json
    var request = NSMutableURLRequest(URL: NSURL(string: url)!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"

    var jsonString = "{\"Authentication\":{\"Username\":\"test\",\"Password\":\"test\"},\"RequestType\":4}"
    var err: NSError?
    request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        //println("Response: \(response)")
        var strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
        print("Body: \(strData)")
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
        // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
        if(err != nil) {
            println(err!.localizedDescription)
            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
            println("Error could not parse JSON: '\(jsonStr)'")
            //postCompleted(succeeded: false, msg: "Error")
        }
        else {
            // The JSONObjectWithData constructor didn't return an error. But, we should still
            // check and make sure that json has a value using optional binding.
            if let parseJSON = json {
                // Okay, the parsedJSON is here, let's get the value for 'success' out of it

                let success = parseJSON["StatusCode"]as? Int

                if(success == 200) {

                   println("success")
                }
                return
            }
            else {
                //                    // Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                println("Error could not parse JSON: \(jsonStr)")
                self.loadingIndicator.stopAnimating()
            }
        }
    })
    task.resume()

我在swift 2中尝试以下代码

     //Post request to json
        let request = NSMutableURLRequest(URL: NSURL(string: url)!)
        let session = NSURLSession.sharedSession()
        let jsonString : NSString = "{\"Authentication\":{\"Username\":\"\(usernameTextField.text)\",\"Password\":\"\(passwordTextField.text)\"},\"RequestType\":7}"
        request.HTTPMethod = "POST"

        //request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")


        do {
            let param = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
            request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(param!, options: [])
        } catch {
            print(error)
            request.HTTPBody = nil
        }


            let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
                // handle error
                guard error == nil
                    else
                {
                    return
                }
                print("Response: \(response)")
                let strData = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print("Body: \(strData)")
                let json: NSDictionary?
                do {
                    json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
                } catch let dataError {
                    // Did the JSONObjectWithData constructor return an error? If so, log the error to the console
                    print(dataError)
                    let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    print("Error could not parse JSON: '\(jsonStr)'")
                    // return or throw?
                    return
                }


                // The JSONObjectWithData constructor didn't return an error. But, we should still
                // check and make sure that json has a value using optional binding.
                if let parseJSON = json {
                    // Okay, the parsedJSON is here, let's get the value for 'success' out of it
                    let success = parseJSON["success"] as? Int
                    print("Succes: \(success)")
                }
                else {
                    // Woa, okay the json object was nil, something went worng. Maybe the server isn't running?
                    let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    print("Error could not parse JSON: \(jsonStr)")
                }

            })

            task.resume()

1 个答案:

答案 0 :(得分:0)

let param = jsonString.dataUsingEncoding(NSUTF8StringEncoding)
request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(param!, options: [])

您可以在此处将字符串转换为NSData,然后将结果提供给dataWithJSONObject。我真诚地怀疑你想做什么:)

请改为尝试:

request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(jsonString, options: [])