2016-05-29 12 views
0

Web上のサービスからJSONを取得する関数を作成しようとしていますが、行の1つ(コメント付き)がnilを返すことがありますが、理由はわかりません。どんな助けもありがとう! :)ありがとう!!なぜNSHTTPURLResponseはnilを返しますか? NSURLSession、Swift 2.2

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

NSHTTPURLResponseではなくNSURLResponse – AnthonyR

答えて

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

初期の方法はNSURLResponseをとります。これは、要求されたURLの応答です。 NSURLResponseはどんな種類の応答でもかまいません。

NSHTTPURLResponseNSURLResponseのサブクラスである、あなたは、あなたのWebサービスのエンコード応答がHTTPプロトコルを使用していることを確信している場合にのみ、NSHTTPURLResponseにあなたの応答をキャストすることができます。それ以外の場合、キャストは常にnilを返します。

どのように正確なAPIレスポンスが

1は10あたり1時間、より多くのリクエストを送信しないでください取得するには:

また、私はあなたが使用しているWebサービスは、利用状況のいくつかの制限があることを見ています1つのデバイス/ 1つのAPIキーからの分。通常、天気は変わっていませんので、よく です。

2サーバーの名前をapi.openweathermap.orgとして使用します。 サーバのIPアドレスを使用しないでください。

3都市名、都市の座標または郵便番号の代わりに都市IDでAPIを呼び出す コード。この場合、正確にあなたの都市に正確に反応します。

4無料アカウントには容量とデータの可用性の制限があります。 サーバーからの応答がない場合は、ただちに リクエストを繰り返してみませんが、10分後にのみ応答してください。また、以前のリクエストデータ を保存することをお勧めします。

ここで問題が発生している可能性があります。

関連する問題