2016-11-30 56 views
1

我完全不熟悉Swift或網絡中的開發。我試圖拋出一些簡單的東西,查詢一個URL:使用Swift發送HTTP請求的問題

我想寫一個簡單的程序,我有三個按鈕,每次點擊一個按鈕,我發送數據到data.sparkfun .COM數據流存儲服務,而它將存儲我的變量「test_value」

我需要查詢該網址:閱讀一些簡單的教程後失敗

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

這裏是我想與之合作的代碼:

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 letguard 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() 
} 

注意,有噸的其他小細節在這裏也如需要以百分比轉義鍵和值,如果您要發送什麼比a其他 - zA - Z0 - 9-._,或~(無論是在請求的GET的URL或POST請求的主體)。而且您通常會設置Accept標頭讓服務器知道您希望以何種形式響應,然後編寫代碼來解析這種響應。同樣,如果您使用http而不是https,則需要將NSAppTransportSecurity設置爲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()