将数据从节点服务器发送回iOS设备(使用Swift)

时间:2015-08-21 16:11:32

标签: ios node.js swift

目前,我的iOS(Swift)端的代码向我的节点服务器发送POST请求,该服务器返回状态代码200 - 当它到达服务器时。

问题: 我尝试做的是将数据返回给设备,在这种情况下,请发回“#nice”,

节点侦听帖子请求:

override func viewDidLoad() {
    super.viewDidLoad()
    // create the request & response
    var request = NSMutableURLRequest(URL: NSURL(string: "http://serverlocation.com/path")!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 5)
    var response: NSURLResponse?
    var error: NSError?

    // create some JSON data and configure the request
    let jsonString = "json=[{\"str\":\"Hello\",\"num\":1},{\"str\":\"Goodbye\",\"num\":99}]"
    request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    request.HTTPMethod = "POST"
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

    // send the request
    NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

    // look at the response
    println("The response: \(response)")
    if let httpResponse = response as? NSHTTPURLResponse {
        println("HTTP response: \(httpResponse.statusCode)")
    } else {
        println("No HTTP response")
    }
}

和斯威夫特:

RVAL

1 个答案:

答案 0 :(得分:1)

要获取响应体,您需要存储方法sendSynchronousRequest返回的数据,然后将其设为字符串,因为sendSynchronousRequest返回NSData对象的实例。
它会是这样的:

let body = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)
let bodyStr = NSString(data: body!, encoding: NSUTF8StringEncoding)
print(bodyStr)

那就是说,我建议不要对服务器使用同步请求,这会阻止UI直到完成,这可能会让最终用户烦恼。要使此异步请求,您可以更改方法+ sendSynchronousRequest:returningResponse:error:的方法+ connectionWithRequest:delegate:。然后使视图控制器成为您的委托,并在其中实现方法:
- connection:didReceiveResponse:
- connection:didReceiveData:
捕获响应并处理其中的数据。另外,请不要忘记将NSURLConnectionDataDelegate添加到ViewController的声明或您设置为委托的类中。

关于评论中的问题:

  

从ViewController或AppDelegate发送这些请求会更好吗?

放置此代码的位置取决于您要检索的数据。将AppDelegate中的内容放在一边是一个坏主意,除非您想要做什么,无论什么,无论视图中发生了什么。 如果它正在检索与您将在此特定视图中显示的内容相关的信息,则将其放在ViewController上将是一个好主意。否则,如果信息与数据结构之类的内容更相关,那么创建另一个从服务器检索数据的类并以适当的形式为此数据结构处理它将更有意义。