Swift根本无法发送URLRequest?

时间:2014-12-31 10:46:30

标签: ios swift nsurlrequest nsurlsession

无论我做什么,似乎我都没有成功发送请求。鉴于以下示例代码,我逐字逐句复制,以查看结果。然而,没有任何反应,我真的很困惑,需要帮助找出为什么我可以用客观的c发送请求,但不管有多少变化NSURLRequest NSURLSession我尝试它从不适用于swift。 / p>

var url : String = "http://google.com?test=toto&test2=titi"

var request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: url)
request.HTTPMethod = "GET"

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(),

    completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

        if (jsonResult != nil) {
            println("help me")
            // process jsonResult
        } else {
            println("hmmm")
            // couldn't load JSON, look at error
        }
})

2 个答案:

答案 0 :(得分:4)

不要测试 commande line项目上的网络异步请求。 执行流程将在asynchronousRequest终止之前停止...您需要为此添加运行循环Check out this link举个例子。

你应该养成打印出来自请求的所有内容的习惯,以了解发生了什么。在确定请求按预期工作后,您可以注释掉所有内容。

var url : String = "http://google.com?test=toto&test2=titi"

var request : NSMutableURLRequest = NSMutableURLRequest()
request.URL = NSURL(string: url)
request.HTTPMethod = "GET"

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(),

    completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        println("OK")

        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)

        println("Body: \(strData)\n\n")
        println("Response: \(response)")

        var err:NSError?
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary

        if (jsonResult != nil) {
            println("jsonresult : \(jsonResult)")
            // process jsonResult
        } else {
            println(err.debugDescription)
            // couldn't load JSON, look at error
        }
})

我添加了一行来打印转换为NSData的{​​{1}}。 这里的数据是 nil

这解释了 JSON解析错误。

此外,您创建错误的方式也不对。看看我的版本来纠正它。

答案 1 :(得分:1)

您没有检查各种变量的结果。如果您正在尝试诊断问题,则必须查看每个关键变量。例如,首先检查请求是否成功,如果不成功,请立即退出。否则,尝试解析JSON,如果成功则显示结果对象,但在失败时显示解析错误。如果JSON解析失败(就像使用此URL一样),您甚至可能会查看返回数据的字符串表示。

仅供参考,使用NSError处理NSJSONSerialization对象也不正确。它应该看起来像:

var parsingError: NSError?
if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parsingError) as? NSDictionary {
    // success, use `jsonResult`
} else {
    // failure, look at `parsingError`
}

把所有这些放在一起:

let url = "http://google.com?test=toto&test2=titi"

let request = NSMutableURLRequest(URL: NSURL(string: url)!)
request.HTTPMethod = "GET"

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) {
    response, data, error in

    if data == nil {
        println("request error: \(error)")
        return
    }

    var parsingError: NSError?
    if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parsingError) as? NSDictionary {
        println("json parsed: \(jsonResult)")
    } else {
        println("parsing error: \(parsingError)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("data: \(responseString)")
    }
}

这将使用此特定URL失败,因为响应不是JSON,但这也将显示响应的字符串表示形式。