Microya 0.1.1

Microya 0.1.1

Cihat Gündüz维护。



Microya 0.1.1

Build Status codebeat badge Swift: 4.2 Platforms: iOS | macOS | tvOS | watchOS License: MIT

安装用法问题贡献许可证

Microya

Swift编写的小型版本Moya网络抽象层。

安装

支持通过CocoaPodsCarthageSwiftPM以及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"
}

第2步:使你的API遵循JsonApi规范

为你的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获取详细信息。