LKAPI
LKAPI是一个与Alamofire交互的swift微框架,用于定义严格的端点列表及其用法。
用法
LKAPI 允许您定义一个包含您端点的枚举
enum Router: Routable {
case Login(email: String, password: String)
case Signup(name: String, email: String, password: String)
...
并通过定义HTTP方法、路径、参数、头部信息以及用于编写单元测试的模拟数据来映射它们的工作方式。
...
var method: Alamofire.Method {
switch self {
case .Login, .Signup:
return .POST
}
}
var path: NSURL {
switch self {
case .Login:
return NSURL(string: "http://mysuperawesomeapp.com/login")!
case .Signup:
return NSURL(string: "http://mysuperawesomeapp.com/signup")!
}
}
要使用Routable
,必须指定method
和path
,还可以定义parameters
、headers
和mockData
。
要执行一个请求,调用Routable
对象的.request
方法
Router.Login("My Email", password: "Pass123").request({ data in
//Handle successful response
}) { error in
//Handle failure
}
API
也可以执行独立的请求
func request(URLRequest: NSURLRequest, success: successCallback?, failure: failureCallback?)
安装
LKAPI可通过CocoaPods获得。要安装它,只需将以下行添加到Podfile
pod "LKAPI"
环境
LKAPI 包含一个名为 Environment
的类。环境类使得在一个项目中定义多个目标和不同参数变得容易。例如,你可以有一个用于生产API的目标,另一个用于预演,还有一个用于单元测试。生产环境会定义生产URL,预演端点会定义预演URL。你也可以定义一个用于测试的目标,LKAPI会自动检测并返回你的模拟数据(如果存在)。模拟数据应该作为包含端点数据的.json
文件的名称传递给Routable
对象。字符串应该是文件名称,不包含'.json'。
要设置环境,创建一个名为 Target-Name
-Env.plist 的文件。在这个文件中,你可以为每个目标定义不同的键及其相应的值。确保环境文件中的属性匹配。对于测试目标,创建一个值为 Testing 的 description 属性。
接下来,扩展 Environment
以自定义定义的属性。为植树文件中除了 description
以外的每个属性添加一个静态函数。例如:
extension Environment {
static var apiBasePath: String {
return Environment.environmentDict["apiBasePath"] as? String ?? ""
}
}
设置
使用LKAPI的第一步是创建一个路由器。路由器将是一个枚举,响应于Routable
协议。路由器将负责定义API端点、发送到端点的参数以及与它们关联的任何模拟测试数据。下面定义了一个路由器示例
enum Router: Routable {
case Login(String, String)
///HTTP Method for the request
var method: Alamofire.Method {
switch self {
case .Login(_):
return .POST
}
///Path to the endpoint
var path: NSURL {
var pathComponent: String
switch self {
case .Login(_):
pathComponent = "/sessions/"
}
return NSURL(string: Environment.apiBasePath)!.URLByAppendingPathComponent(pathComponent)
}
///Optional parameters to send up with each request
var parameters: [String: AnyObject]? {
switch self {
case .Login(let email, let password):
return ["email": email, "password": password]
default:
return nil
}
}
///Optional headers to send up with each request
var headers: [(String, String)]? {
switch self {
case .Login(let email, let password):
return nil
default:
if let token = someToken {
return [("Authorization", "Token \(token)")]
}
return nil
}
}
//Only define if you need to customize it. This is returned by default
///URLRequest object
var URLRequest: NSMutableURLRequest {
let request = NSMutableURLRequest(URL: path)
request.HTTPMethod = method.rawValue
if let headers = headers {
for header in headers {
request.setValue(header.1, forHTTPHeaderField: header.0)
}
}
let encoding = Alamofire.ParameterEncoding.JSON
return encoding.encode(request, parameters: parameters).0
}
///Mock data to return for tests
var mockData: String? {
return nil
}
}
这些路由器对象将被发送给API类以配置API请求。建议你对API类扩展以添加自己的端点。例如,以下是对路由器的登录案例的扩展。
extension API {
class func login(email: String, password: String, success: (User -> ())?, failure: failureCallback?) {
//Do any field validation
Router.Login(email, password: password).request(route, success: { data in
if let data = data as? [String: AnyObject] {
let user = User(data: data)
success?(user)
}
else {
failure?(Failure(error: NetworkError.BadData))
}
}, failure: failure)
}
}
还建议配置名称以提高API数据的解析能力。
作者
Erik Sargent, [email protected]
许可证
LKAPI 提供 MIT 许可证。更多详细信息请查阅 LICENSE 文件。