有关用 Swift 访问后端服务器的 API 文档中

本文讲的是有关用 Swift 访问后端服务器的 API 文档中,

我最近开始开发一个全新的项目,并且我正尝试一些新的设计模式,因为我开始投身于 Swift 3。我正使用的一个模式是“请求和响应模型”。这个“酷炫”的名字是我为记录这个后台 API 文档中的 Struct (结构体)。让我们来看一个例子:

import Alamofire

protocol Request {
    var path : String { get }
    var method : Method { get }
    func parameters() -> [String : AnyObject]
}

struct AuthRequest : Request {
    let path = "auth"
    let method = Method.POST

    var password : String
    var password_verify : String
    var name : String
    var email : String

    func parameters() -> [String : AnyObject] {
        return ["password" : password, "password_verify" : password_verify, "name" : name, "email" : email]
    }
}

我们申明了一个 Request 协议,关于你所需要知道发起一个 API 请求的所有内容,它基本上都明确指出来了。

  • 需要添加进基本地址 (URL) 的路径(本例中是 auth )
  • HTTP 方法(GETPOSTPUTDELETE 等等)
  • 端点所要求的参数

为了需要的信息,你可以扩展这个协议,例如某个指定的 ContentType 或者其他 HTTP 报头。你能想象到增加一些验证规则,(请求)完成处理方法,或者与这个协议网络请求有关的任何东西。

所有这些结构体现在应该看上去像一个简明扼要的 API 文档,并且为你的网络操作提供了一些框架结构和类型安全验证。你可以把这些请求的结构体转变成你最喜欢的网络客户端。我有一个例子 Alamofire

class Client {
    var baseURL = "http://dev.whatever.com/"

    func execute(request : Request, completionHandler: (Response<AnyObject, NSError="">) -> Void){
        Alamofire.request(request.method, baseURL + request.path, parameters: request.parameters())
            .responseJSON { response in
                completionHandler(response)
        }
    }
}

Client().execute(request: AuthRequest(/*Insert parameters here*/), completionHandler: { response in } )

我们把 AuthRequest 对象传递给 Alamofire,它需要一个通用的对象去确认 Request 协议。它使用来自协议中规定的属性/方法来构造并执行一个网络请求。

现在我们已经定义了这个请求的结构体,并且使用它简单的访问服务器。我们现在需要处理响应。我们的 AuthRequest 返回一个不太大的用户 JSON 对象,我们需要把它序列化成一个 Swift 对象。

struct UserResponse {
    var _id : String
    var first_name : String
    var last_name : String

    init(JSON: [String : AnyObject]) {
        _id = JSON["_id"] as! String
        first_name = JSON["first_name"] as! String
        last_name = JSON["last_name"] as! String
    }
}

/* Inside our completion handler */
var user = UserResponse(JSON: response.result.value as! [String : AnyObject])

这个实现不太花哨,但是仍然记录了响应对象的属性。你能创建一个协议,它用来定义一个 JSON 初始器,但是使用简单的结构体目前对我来说已经足够了。






原文发布时间为:2016年09月10日

本文来自云栖社区合作伙伴掘金,了解相关信息可以关注掘金网站。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值