为什么我的回报是零,但如果我按下chrome/safari中的url,我可以得到数据?

Yim*_*hen 1 nsurlrequest swift

@IBAction func mainButtonnBeTapped(sender: AnyObject) {
        let session = NSURLSession.sharedSession()
        let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!)
        let task = session.dataTaskWithRequest(request, completionHandler: {
            (data, response, error) -> Void in            
            let myString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("this is my string: \(myString)")
        })
        task.resume()
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用上面的url尝试获取一些数据,但返回值为nil,但我输入chrome/safari中的url,我可以得到一些数据.我真的不知道为什么,任何人都可以帮忙解释一下吗?

Mar*_*n R 9

这个HTTP服务器发送一个

Content-Type = application/x-javascript; charset=GBK
Run Code Online (Sandbox Code Playgroud)

响应中的头字段,因此您从textEncodingName属性中获取正确的编码NSURLResponse.这可以转换为NSStringEncoding.

这只是将/sf/answers/1391982441/中提供的解决方案转换为Swift,以及一些简单的错误检查:

let session = NSURLSession.sharedSession()
let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!)
let task = session.dataTaskWithRequest(request, completionHandler: {
    (data, response, error) -> Void in   

    var usedEncoding = NSUTF8StringEncoding // Some fallback value
    if let encodingName = response.textEncodingName {
        let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName))
        if encoding != UInt(kCFStringEncodingInvalidId) {
            usedEncoding = encoding
        }
    }
    if let myString = NSString(data: data, encoding: usedEncoding) {
        println("this is my string: \(myString)")
    } else {
        println("failed to decode data")
    }
})
task.resume()
Run Code Online (Sandbox Code Playgroud)

输出:

this is my string: var hq_str_sz000609="????, ....

Swift 2需要进行微小的更改:

let session = NSURLSession.sharedSession()
let request = NSURLRequest(URL: NSURL(string: "http://hq.sinajs.cn/list=sz000609")!)
let task = session.dataTaskWithRequest(request, completionHandler: {
    (data, response, error) -> Void in   

    var usedEncoding = NSUTF8StringEncoding // Some fallback value
    if let encodingName = response?.textEncodingName {
        let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName))
        if encoding != UInt(kCFStringEncodingInvalidId) {
            usedEncoding = encoding
        }
    }
    if let myString = String(data: data!, encoding: usedEncoding) {
        print("this is my string: \(myString)")
    } else {
        print("failed to decode data")
    }
})
task.resume()
Run Code Online (Sandbox Code Playgroud)

Swift 3更新:

let session = URLSession.shared
let request = URLRequest(url: URL(string: "http://hq.sinajs.cn/list=sz000609")!)
let task = session.dataTask(with: request, completionHandler: {
    (data, response, error) -> Void in

    guard let data = data else { return }

    var usedEncoding = String.Encoding.utf8 // Some fallback value
    if let encodingName = response?.textEncodingName {
        let encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName as CFString))
        if encoding != UInt(kCFStringEncodingInvalidId) {
            usedEncoding = String.Encoding(rawValue: encoding)
        }
    }
    if let myString = String(data: data, encoding: usedEncoding) {
        print("this is my string: \(myString)")
    } else {
        print("failed to decode data")
    }
})
task.resume()
Run Code Online (Sandbox Code Playgroud)