Vega是参照Retrofit使用方式写的一个声明式网络请求描述框架
使用方式:
pod 'Vega'
如何发起请求
在简单的配置之后,你可以两行代码就实现一个网络接口 例如:请求Github的REST接口
@GET("https://api.github.com/orgs/apple/repos")
static var appleRepositories: ActionModel<Empty, [GHRepository]>
调用代码同样简单:
appleRepositories.request { (result) in
switch result {
case .failure(let error):
break
case .success(let list): // list: [GHRepository]
break
}
}
如何描述一个网络接口
var myNetApi: ActionModel<PageSize, BookList>
一个ActionModel就是一个请求,后面跟上请求参数类型和输出参数类型,上面的例子中,PageSize是请求的输入类型,BookList则是输出的类型。 如果你的ActionModel不需要输入,或者你不关心输出,那么就可以使用Empty作为他的类型 当然,只是写明ActionModel还不够,我们还要给他加上标注信息
@GET("my/book/list/path")
var myNetApi: ActionModel<Input, Output>
这样就完成了一个请求的描述。 实际上GET/POST,还支持另外几个参数:
@GET(_ path: String, _ properties: ActionModelProperty..., input: ActionInput, output: ActionOutput)
多种的请求描述方式
你还可以使用以下的方式来描述接口
@GET("my/path", input: .tuple)
static var getSuggestedBookList: ActionModel<(age: Int, category: String), [Book]>
使用起来像这样:
getSuggestedBookList.request((age: 10, category: "cartoon")) { (result) in
print(result)
}
input一共支持如下种类:
public enum ActionInput {
case encodable // 输入类型是Encodable类型
case dict // 输入类型是Dict
case key(_ keyName: String) //输入的数据以[key: value]方式上传
case tuple //输入的数据以[tupleKey1: tupleValue1, tupleKey2: tupleValue2, ...]方式上传
}
同样,如果你不想要所有的输出数据,而只关心某些键值对,一样可以有不同的描述方式
public enum ActionOutput {
case decodable // 输出是Decodable类型
case dict // 输出是Dict类型
case key(_ keyName: String) // 从获取的数据中,找出指定key的值作为输出
case tuple // 从获取的数据中,找到tuple中指定的key做为输出
}