LKAPI 1.4.4

LKAPI 1.4.4

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2021年3月
SPM支持SPM

Erik SargentZac JohnsonShane Thompson维护。



LKAPI 1.4.4

  • Erik Sargent

LKAPI

LKAPI是一个与Alamofire交互的swift微框架,用于定义严格的端点列表及其用法。

Circle CI

用法

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,必须指定methodpath,还可以定义parametersheadersmockData

要执行一个请求,调用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 的文件。在这个文件中,你可以为每个目标定义不同的键及其相应的值。确保环境文件中的属性匹配。对于测试目标,创建一个值为 Testingdescription 属性。

接下来,扩展 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 文件。