无论我做什么,似乎我都没有成功发送请求。鉴于以下示例代码,我逐字逐句复制,以查看结果。然而,没有任何反应,我真的很困惑,需要帮助找出为什么我可以用客观的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
}
})
答案 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,但这也将显示响应的字符串表示形式。