RetroSwift

SwiftPM License: MIT

一个轻量级的 Swift REST API 请求生成库。

安装 RetroSwift

RetroSwift 支持 Swift Package Manager

Swift Package Manager

要使用 Swift Package Manager 安装 RetroSwift,您可以按照 Apple 发布的教程,使用 RetroSwift 仓库的 URL 和当前版本。

  1. 在 Xcode 中,选择 “File” → “Add Packages...”
  2. 输入 https://github.com/rmichelberger/RetroSwift

或者您可以将以下依赖项添加到您的 Package.swift 文件中

.package(url: "https://github.com/rmichelberger/RetroSwift/", from: "1.0.0")

用法

请求

您可以通过以下方式创建 HTTP 请求。首先,您需要将基本 URL 定义为 String 类型,并指定 HTTP 方法。

基本请求

示例

let baseUrl = "https://example.com"
@GET(baseURL: baseUrl) var request

路径

您还可以选择性地定义 path(路径)。

@Path(path: "/my/path") var path

您还可以在 path(路径)中定义动态参数。示例

let id = 123
@Path(path: "/api/v1/items/{id}", name: "id") var path = id

let id = "xyz"
@Path(path: "/api/v1/items/{parameter}", name: "parameter") var path = id

参数必须实现 CustomStringConvertible 协议。

查询参数

@Query(name: "name") var query = 123

@Query(name: "name") var query = "value"

name(名称)需要是 String 类型,而 value(值)必须实现 CustomStringConvertible 协议。

请求体

@Body(value: value) var body

value(值)必须实现 Encodable 协议。

您还可以定义自己的 DataEncoder(数据编码器),默认的是 JSONEncoder(JSON 编码器)。

@Body(value: value, encoder: encoder) var body

您可以将请求体添加到 HTTP 请求中

func getItem(id: Int) async throws -> Item {
    let baseUrl = "https://example.com"

    @Path(path: "/api/v1/items/{id}", name: "id") var path = id

    let user = ["Name": "John Doe"]
    @Body(value: user) var body
    @POST(baseURL: baseUrl, path: path, body: body) var request
    return try await retroSwift.execute(request: request)
}

请求头

您可以按如下方式指定请求头

@Header(name: "Content-Type") var contentType = "application/json"

name(名称)是请求头的名称,而 value(值)必须符合 CustomStringConvertible 协议。

请求示例

func getItem(id: Int) async throws -> Item {
    let client = ... // see below
    let baseUrl = "https://example.com"
    let retroSwift = RetroSwift(client: client)
    @Path(path: "/api/v1/items/{id}", name: "id") var path = id
    @Query(name: "fields") var fields = "id,title"
    @Query(name: "limit") var fields = 100
    @GET(baseURL: baseUrl, path: path, queries: [fields]) var request
    return try await retroSwift.execute(request: request)
}

这将生成以下请求

HTTP GET https://example.com/api/v1/items/14572?fields=id,title&limit=100

支持的方法

HTTP 方法 用法
GET @GET(...)
PUT @PUT(...)
POST @POST(...)
DELETE @DELETE(...)
OPTIONS 即将推出
TRACE 即将推出
PATCH 即将推出
CONNECT 即将推出
HEAD 即将推出

HTTP 客户端

您需要为 RetroSwift 提供一个 HTTP 客户端。该客户端必须实现 HTTPClient 协议。

protocol HTTPClient {
    func execute<T: Decodable>(request: URLRequest) async throws -> T
}

推荐使用 OkHTTPClient 作为网络客户端。

待办事项

贡献

我们始终欢迎来自社区的贡献。请确保您的更改包含单元测试。

灵感来源于 Retrofit