我试图在Swift 2.2中使用NSURLSession
为我在端口3000本地运行的服务器编写一个简单的API客户端。服务器只提供一个静态的JSON字符串。< / p>
这很好用:
$ curl http://localhost:3000
{"data":"value"}
我的Swift代码来点击API:
// api_client.swift
let url = NSURL(string: "http://localhost:3000/api")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
print("The response was:")
print(NSString(data: data!, encoding: NSUTF8StringEncoding))
}
print("Running the request...")
task.resume()
我试图从命令行运行它
$ swift api_client.swift
Running the request...
但这就是发生的一切。我没有看到&#34;回复是&#34;行打印,或来自服务器的响应。当我检查服务器日志时,它显示没有任何请求进入。
我做错了什么?我对Swift很新,我很难搞清楚这一点。我是关于Swift 2.2和XCode 7.3的。
答案 0 :(得分:0)
跟进pbush25的说法。您可以尝试在代码中创建回调吗?
func GET(path : String, callback: (result: NSData?, response: NSHTTPURLResponse?, error: NSError?) -> Void) {
let session = NSURLSession.sharedSession()
let url = NSURL(string: path)
let task = session.dataTaskWithURL(url!){
(data, response, error) -> Void in
if (error != nil) {
// return the NSData as nil (since you have an error)
callback(result: nil, response: response as? NSHTTPURLResponse, error: error!)
} else {
// return the NSData
callback(result: data, response: response as? NSHTTPURLResponse, error: nil)
}
}
task.resume()
}
然后用:
调用你的函数GET("http://localhost:3000/api") {
(data, response, error) -> Void in
print(data)
}
答案 1 :(得分:0)
感谢pbush25我发现我的请求没有执行,因为运行时在异步请求启动之前到达了文件的末尾。
Another user with this problem使用信号量解决了它,但是通过在代码底部添加sleep(1)
来快速而肮脏地证明这是问题。如果我这样做,我会在日志中看到请求并返回数据!