swift - ¿Por qué mi devolución es nula pero si presiono la URL en Chrome/Safari, puedo obtener datos?
nsurlrequest (2)
@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()
}
Estoy usando la url anterior para intentar obtener algunos datos, pero el retorno es nulo, pero ingreso la url en chrome / safari, puedo obtener algunos datos. Realmente no sé por qué, ¿alguien puede ayudar a explicar?
El texto que intenta obtener probablemente no sea UTF-8, intente con otra codificación, como esta, por ejemplo:
let myString = NSString(data: data, encoding: NSASCIIStringEncoding)
Actualización: lea la respuesta de Martin R sobre cómo encontrar la codificación correcta.
Este servidor HTTP envía un
Content-Type = application/x-javascript; charset=GBK
campo de encabezado en la respuesta, por lo tanto, obtiene la codificación correcta de la propiedad
textEncodingName
de
NSURLResponse
.
Esto se puede convertir a
NSStringEncoding
.
Esto es solo una traducción de la solución presentada en https://.com/a/19885463/1187415 a Swift, más algunas comprobaciones de errores simples:
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()
Salida:
this is my string: var hq_str_sz000609="绵世股份, ....
Se necesitan cambios menores para 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()
Actualización para 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()