2016-11-30 11 views
1

私はSwiftやネットワーキングの開発にはまったく新しいです。 URLを照会する単純なものを投げようとしています。Swiftを使用してHTTPリクエストを送信する際の問題

私は3つのボタンがある単純なプログラムを作成しようとしていますが、ボタンをタップするたびにdata.sparkfun失敗したいくつかの簡単なチュートリアルを読んだ後

ここ
http://data.sparkfun.com/input/XGyzWVyDdEFKDE42W99r?private_key=KEYVALUE&test_value=1" 

私が一緒に仕事しようとしているコードがある:それは私の変数「test_value」

を格納します.COMデータストリーム格納サービスは、私はこのURLを照会する必要があります:

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

@IBAction func ColorTwoTapped(_ sender: Any) { 
    print("Color 2") 
} 

@IBAction func ColorOneTapped(_ sender: Any) { 
    print("Color 1") 

    let scriptUrl = "http://data.sparkfun.com/input/XGyzWVyDdEFKDE42W99r" 

    let urlWithParams = scriptUrl + "?private_key=KEYVALUE&test_value=1" 

    let myUrl = NSURL(string: urlWithParams); 


    let task = URLSession.sharedSession().dataTaskWithURL(myUrl!) {(data, response, error) in 
     print(String(data: data!, encoding: NSUTF8StringEncoding)) 
    } 

    task.resume() 


} 

@IBAction func ColorThreeTapped(_ sender: Any) { 
    print("Color 3") 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

私が手にエラーが

Cannot call value of non-function type 'URLSession'. 

ある任意のアドバイス

+0

NSURLSessionを試しますか? – koropok

答えて

1

あなたが選択したチュートリアルはスウィフト2.xのために書かれたようですが、あなたは明らかにスウィフト3ではスウィフト3.

を使用しているのに対し、この方法は以下のようになり、見えます:

@IBAction func colorOneTapped(_ sender: Any) { 
    print("Color 1") 

    let scriptUrl = "http://data.sparkfun.com/input/XGyzWVyDdEFKDE42W99r" 

    let urlWithParams = scriptUrl + "?private_key=KEYVALUE&test_value=1" 

    let myUrl = URL(string: urlWithParams) 

    let task = URLSession.shared.dataTask(with: myUrl!) { data, response, error in 
     guard let data = data, error == nil else { 
      print("\(error)") 
      return 
     } 

     let string = String(data: data, encoding: .utf8) 
     print("\(string)") 
    } 

    task.resume() 
} 

注:URLではなく、NSURLです。それはsharedであり、sharedSession()ではありません。同様にdataTaskWithURL(_:completionHandler:)dataTask(with:completionHandler:)になりました。また、!強制アンラッピングを避け、オプションのバインディング(例:if letまたはguard let)を使用することをおすすめします。


注意、あなたはサーバー上に格納されるデータを送信した場合、あなたは一般的にPOSTを使用したい:

@IBAction func colorOneTapped(_ sender: Any) { 
    print("Color 1") 

    let urlString = "http://data.sparkfun.com/input/XGyzWVyDdEFKDE42W99r" 

    let url = URL(string: urlString) 
    var request = URLRequest(url: url!) 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.httpBody = "private_key=KEYVALUE&test_value=1".data(using: .utf8) 
    request.httpMethod = "POST" 

    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else { 
      print("\(error)") 
      return 
     } 

     let string = String(data: data, encoding: .utf8) 
     print("\(string)") 
    } 

    task.resume() 
} 

注、他のほとんどの詳細のトンは、そのような必要として、あまりにも、ここにあります中かどうか9-._、または~( - zA - - Z0あなたはa以外のものを送信することがあります場合にキーと値をパーセントエスケープGETのURLまたはPOSTリクエストの本文)。そして、あなたはしばしば応答を期待しているフォームでサーバーに知らせるためにAcceptヘッダーを設定し、そのような応答の種類を解析するコードを記述します。同様に、httpsではなく、httpを使用している場合は、をInfo.plistに設定する必要があります。


また、あなたはあまりにもこれらの詳細の全てで迷子にしたくない場合はAlamofireのようなものを使用して検討する必要があります。

0

ためのおかげでNSURLSessionでURLSessionを交換してください。ガードを使用して、データがゼロでないかどうかを確認します。

let task = NSURLSession.sharedSession().dataTaskWithURL(myUrl!) {(data, response, error) in 
    guard let data = data else { 
     return 
    } 
    print(String(data: data, encoding: NSUTF8StringEncoding)) 
} 

task.resume() 
関連する問題