我试图编写一个函数从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()
}
答案 0 :(得分:1)
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分钟后。我们也建议存储 您之前的请求数据。
现在我认为你的问题可能来自那里。