2016-11-30 23 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()