【问题标题】:Swift 2.0: Best Practice for communication to a REST API with JSON [closed]Swift 2.0:使用 JSON 与 REST API 通信的最佳实践 [关闭]
【发布时间】:2015-11-17 10:42:24
【问题描述】:

我开始迁移到 Swift,然后才意识到大多数示例代码在 Swift 2.0 中不再适用,而且作为初学者真的很难入门。

那么,在 Swift 2.0 中使用标准库中的 Swift 方法与 REST API 进行通信的最佳实践是什么?

谁能提供以下场景的 Swift 2.0 代码?

  1. 从服务获取 JSON 数据
  2. 解析 JSON(以便在 Swift 中使用)
  3. 发送带有 JSON 编码数据的 POST 请求

请提供没有框架的解决方案。希望它可以帮助所有其他尝试从 Web 获取教程以使用 Swift 2.0 的人。

【问题讨论】:

  • 我建议您尽最大努力将您找到的 Swift 1.2 示例之一转换为 Swift 2.0。转换真的不是很难。如果您对 Swift 2.0 语法有疑问,请参阅 WWDC 2015 视频 What's New in Swift。不过,在回答您的问题时,我建议您考虑使用 Swift 2.0 branch of Alamofire,它可以简化请求的准备和响应的解析。
  • @Rob 根据 Stackoverflow 上的所有 cmets,我决定专门针对 Swift 2.0 BP - 因为 JSON 解析某些函数参数发生了变化,并且如前所述,作为初学者很难获得。 2015 WWDC 视频对第 2 步没有真正的帮助。

标签: ios json swift rest nsurl


【解决方案1】:

我也是一个初学者,我不能说我所做的是最佳实践,但这是我使用 NSURLSession 和闭包处理 GET 请求的方式。

首先,我定义了一个 NetworkOperation 类,它将处理 NSURLSession。它具有以下属性:

lazy var config: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
lazy var session: NSURLSession = NSURLSession(configuration: self.config)
let queryURL: NSURL

在初始化程序中,我设置了 queryURL。配置和会话变量是lazy因为我希望它们仅在使用我的网络操作时才被初始化。

然后我有一个执行 GET 请求并检索 JSON 的方法。此方法接受一个闭包作为参数。这个闭包将由调用者提供,并允许我将我的 dataTask 响应捕获到调用上下文中。

func downloadJSONFromURl(completion: ([String:AnyObject]?) -> ()) {
    let request = NSURLRequest(URL: queryURL)

    let dataTask = session.dataTaskWithRequest(request) {
        (let data: NSData?, let response: NSURLResponse?, let error: NSError?) -> Void in

        // 1: Check HTTP Response for successful GET request
        guard let httpResponse = response as? NSHTTPURLResponse, receivedData = data
        else {
            print("error: not a valid http response")
            return
        }

        switch (httpResponse.statusCode) {
        case 200:
            // 2: Create JSON object with data
            do {
                let jsonDictionary = try NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments)
                    as? [String:AnyObject]

                // 3: Pass the json back to the completion handler
                completion(jsonDictionary)
            } catch {
                print("error parsing json data")
            }
        default:
            print("GET request got response \(httpResponse.statusCode)")
        }
    }
    dataTask.resume()
}

这个例子很简单,不处理错误,但是你可以看看我是如何将 JSON 解析成 [String:AnyObject] 成 try catch 块的。

之后,我将字典发送回名为 completion 的闭包,该闭包将对 JSON 执行必要的验证,然后将其转换为 Swift 对象。

在那个闭包中,我使用可选绑定来安全地构建我的对象。 例如,假设我正在检索一本书,JSON 看起来像这样: {title: "Some book", author:"J. Doe"}

if let title = json["author"] as? String, author = json["author"] as? String {
    let book = Book(title: title, author: author)
    serviceCompletion(book)
}

因为我喜欢闭包,所以我将转换后的 JSON 发送到另一个提供给服务的闭包中。您可以在我的 github 上查看完整示例。它来自树屋教程。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2021-01-30
    • 2020-12-24
    • 2013-10-23
    相关资源
    最近更新 更多