我正在尝试编写一个从Web上的服务中获取JSON的函数,但是其中一行(已注释)不断返回nil,我也不知道为什么。任何帮助表示赞赏! :) 谢谢!!
func parseJSON(long: CLLocationDegrees, lat: CLLocationDegrees) {
var longitude : String = "\(long)"
var latitude : String = "\(lat)"
longitude = longitude.substringToIndex(longitude.characters.indexOf(".")!)
latitude = latitude.substringToIndex(latitude.characters.indexOf(".")!)
print("\(latitude),\(longitude)")
let appId = "xyz" //Insert API Key
let urlString = "https://api.openweathermap.org/data/2.5/weather?lat=\(latitude)&lon=\(longitude)&units=metric&appid=\(appId)"
let requestURL: NSURL = NSURL(string: urlString)!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
//Keeps returning nil. No idea why.
if let httpResponse = response as? NSHTTPURLResponse {
print("Success!")
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("Everyone is fine, file downloaded successfully.")
} else {
print("STATUSCODE=\(statusCode)")
}
}
}
task.resume()
}
最佳答案
func dataTaskWithRequest(_ request: NSURLRequest,
completionHandler completionHandler: (NSData?,
NSURLResponse?,
NSError?) -> Void) -> NSURLSessionDataTask
初始方法采用
NSURLResponse
。这是所请求URL的响应。 NSURLResponse
可以是任何类型的响应。NSHTTPURLResponse
是NSURLResponse
的子类,仅当您确定Web服务使用HTTP协议对响应进行编码时,才可以将响应转换为NSHTTPURLResponse
。否则,强制类型转换将始终返回nil
。另外,我看到您正在使用的Web服务具有一些使用限制:
如何获得准确的API响应
1每10分钟从一个设备/一个API密钥发送的请求不要超过1次。通常天气不会改变,所以
经常。
2使用服务器的名称作为api.openweathermap.org。请不要
使用服务器的IP地址。
3通过城市ID而不是城市名称,城市坐标或邮政编码来调用API
码。在这种情况下,您将获得针对您所在城市的精确响应。
4免费帐户具有容量和数据可用性的限制。如果
您没有收到服务器的回复,请不要尝试重复您的
立即请求,但仅在10分钟后。我们也建议存储
您以前的请求数据。
现在我在想,您的问题可能出在那儿。
关于ios - 为什么NSHTTPURLResponse返回nil? NSURLSession,Swift 2.2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37514408/