Microya
Swift编写的小型版本Moya网络抽象层。
安装
支持通过CocoaPods、Carthage、SwiftPM以及Mint进行安装。
用法
第一步:定义端点
创建一个包含所有支持端点的Api enum
,并使用作为参数的请求参数/数据定义cases。
例如,在编写Microsoft Translator API客户端时
enum MicrosoftTranslatorApi {
case languages
case translate(texts: [String], from: Language, to: [Language])
}
请注意,上面使用的Language
类型不一定需要是Encodable
类型
enum Language: String {
case english = "en"
case german = "de"
case japanese = "jp"
case turkish = "tr"
}
JsonApi
规范
第2步:使你的API遵循为你的API添加一个扩展,使其满足JsonApi
规范,这意味着你需要实现以下协议的以下功能
protocol JsonApi {
var decoder: JSONDecoder { get }
var encoder: JSONEncoder { get }
var baseUrl: URL { get }
var headers: [String: String] { get }
var path: String { get }
var method: Method { get }
var queryParameters: [(key: String, value: String)] { get }
var bodyData: Data? { get }
}
使用switch
语句根据self
区分不同的 případ (如果需要),并按协议要求提供适当的数据(使用值绑定)。
切换以查看示例
extension MicrosoftTranslatorApi: JsonApi {
var decoder: JSONDecoder {
return JSONDecoder()
}
var encoder: JSONEncoder {
return JSONEncoder()
}
var baseUrl: URL {
return URL(string: "https://api.cognitive.microsofttranslator.com")!
}
var path: String {
switch self {
case .languages:
return "/languages"
case .translate:
return "/translate"
}
}
var method: Method {
switch self {
case .languages:
return .get
case .translate:
return .post
}
}
var queryParameters: [(key: String, value: String)] {
var urlParameters: [(String, String)] = [(key: "api-version", value: "3.0")]
switch self {
case .languages:
break
case let .translate(_, sourceLanguage, targetLanguages, _):
urlParameters.append((key: "from", value: sourceLanguage.rawValue))
for targetLanguage in targetLanguages {
urlParameters.append((key: "to", value: targetLanguage.rawValue))
}
}
return urlParameters
}
var bodyData: Data? {
switch self {
case .translate:
return nil // no request data needed
case let .translate(texts, _, _, _):
return try! encoder.encode(texts)
}
}
var headers: [String: String] {
switch self {
case .languages:
return [:]
case .translate:
return [
"Ocp-Apim-Subscription-Key": "<SECRET>",
"Content-Type": "application/json"
]
}
}
}
第3步:使用结果类型调用API端点
使用预实现的JsonApi
协议中的此方法调用API端点,提供预期的Decodable
类型(如果有的话)
func request<ResultType: Decodable>(type: ResultType.Type) -> Result<ResultType, JsonApiError>
例如
let endpoint = MicrosoftTranslatorApi.translate(texts: ["Test"], from: .english, to: [.german, .japanese, .turkish])
switch endpoint.request(type: [String: String].self) {
case let .success(translationsByLanguage):
// use the already decoded `[String: String]` result
case let .failure(error):
// error handling
}
请注意,您还可以使用Swift 5的Result
类型的投掷get()
函数,而不是使用switch
语句。
let endpoint = MicrosoftTranslatorApi.translate(texts: ["Test"], from: .english, to: [.german, .japanese, .turkish])
let translationsByLanguage = try endpoint.request(type: [String: String].self)
// use the already decoded `[String: String]` result
在Results
类型上还有许多有用的函数,如map()
、flatMap()
、mapError()
和flatMapError()
。有关更多信息,请参阅“转换结果”部分中的这篇文章。
贡献
请参阅文件CONTRIBUTING.md。
许可
此库遵循MIT许可。请参阅LICENSE获取详细信息。