为什么NSHTTPURLResponse返回零? NSURLSession,Swift 2.2

时间:2016-05-29 20:05:50

标签: ios swift nsurlsession

我试图编写一个函数从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()

}

1 个答案:

答案 0 :(得分:1)

func dataTaskWithRequest(_ request: NSURLRequest,
       completionHandler completionHandler: (NSData?,
                                  NSURLResponse?,
                                  NSError?) -> Void) -> NSURLSessionDataTask

初始方法需要NSURLResponse。这是请求的URL的响应。 NSURLResponse可以是任何形式的回应。

NSHTTPURLResponseNSURLResponse的子类,只有在您确定您的Web服务使用HTTP协议编码响应时,才可以将响应转换为NSHTTPURLResponse。否则,演员表将始终返回nil

另外,我发现您使用的Web服务有一些使用限制:

  

如何获得准确的API响应

     

1不要每​​隔10分钟从一个设备/一个API密钥发送超过1次的请求。通常天气不会改变   频繁。

     

2使用服务器名称api.openweathermap.org。请永远不要   使用服务器的IP地址。

     

3按城市ID而不是城市名称,城市坐标或邮编来调用API   码。在这种情况下,您可以准确地对您的城市做出明确的回应。

     

4免费帐户的容量和数据可用性有限制。如果   你没有得到服务器的回应不要试图重复你的   立即请求,但仅在10分钟后。我们也建议存储   您之前的请求数据。

现在我认为你的问题可能来自那里。