网络服务层 结合 REST API CRUD

轻便的网络层,用于创建不同的网络请求集,例如 GET、POST、PUT、DELETE,可通过符合 TopLevelDecoderTopLevelEncoder 的编码器进行自定义

特性

1. 环境

使用接口 IEnvironment 定义 enum

enum Environment: IEnvironment {

    case development

    case production

    var baseURL: String {
        switch self {
            case .development: return "https://:3000"
            case .production: return "https://apple.com"
        }
    }
    
    var headers: [IRequestHeader]? {
        switch self {
            case .development: return [ContentType.applicationJSON]
            case .production: return [ContentType.textJSON]
        }
    }
    
    var logger : ILogger? {
        switch self {
            case .development: return ServiceLogger()
            case .production: return nil
        }
    }  
}

请求标头

请求的所有标头都必须符合接口 IRequestHeader

内容类型标头的示例实现在此处 ContentType.swift

日志记录器

如果您不需要来自 URLRequestURLResponse 的某些特定数据,或者使用接口 ILogger 定义自己的日志记录器,则可以使用开箱即用的标准日志记录器 ServiceLogger

2. 端点 API

定义端点 API enum

enum UserRestAPI {

    case index
    case read(id: Int)
    case create
    case update
    case delete(id: Int)
}

使用接口 IRequest 扩展 enum

字段 类型
路由 字符串
方法 RequestMethod
extension UserRestAPI: IRequest {
    
    var route: String {
        switch self {
            case .index: return "/user"
            case .read(let id): return "/user/\(id)"
            case .create: return "/user"
            case .update: return "/user"
            case .delete(let id): return "/user/\(id)"
        }
    }
    
    var method: RequestMethod {
        switch self {
            case .index: return .get
            case .read(_): return .get
            case .create: return .post
            case .update: return .put
            case .delete(_): return .delete
        }
    }
}

示例实现位于 UserRestAPI.swift UserRestAPI.swift

3. 创建网络服务

    let network = NetworkService(environment: Environment.development)

目前有四种可用方法:GET、POST、PUT、DELETE

参数

将 [String: CustomStringConvertible] 字典传递给可用于 GET、POST、PUT 请求的参数。这是一个可选参数。

读取

   let cfg = UserRestAPI.read(id: 1)
   
   let publisher: Output = network.execute(with: cfg, ["token" : 65678])

创建

    let cfg = UserRestAPI.create
    let user = Model(id: 11, name: "Igor")

    let publisher: Output = network.execute(body: user, with: cfg)

更新

    let cfg = UserRestAPI.update
    let user = Model(id: 11, name: "Igor")    

    let publisher: Output = network.execute(body: user, with: cfg)

删除

    let cfg = UserRestAPI.delete(id: 11)
    
    let publisher: Output = network.execute(with: cfg)

4. 管理请求

链式请求

        let read: Output = network.execute(with: UserRestAPI.index)

        let user = Model(id: 11, name: "Igor")
        let create: Output = network.execute(body: user, with: UserRestAPI.create)
        
        read.then(create)
            
        // or chain it using predicate to analyze previous result
        
        read.then(ifTrue : {$0.count > 1}, create)

并行执行无限数量的请求

将结果收集在数组中,并等待所有请求完成

所有请求都期望相同的输出和失败

       [read, create, delete, update, read, read ].doTogether

混合

首先将 创建更新 请求作为一个组,然后 读取

        [create, update]
                       .waitEverybody
                       .then(read)
                      
        [create, delete]
                        .waitEverybody
                        .then([delete, read].doTogether)               

软件包安装

在 Xcode 中 - 选择 Xcode>File> Swift Packages>Add Package Dependency...
并添加 https://github.com/The-Igor/d3-network-service

在真实环境中尝试

简单服务器安装 (使用 NodeJS Express 模拟)

为了在真实环境中尝试,我建议安装基本的 NodeJS Express 样板。看看视频片段,了解通过 Webstorm 获取它是多么容易,Webstorm 在试用期内可以免费使用。

Server instalation (NodeJS Express)

真实 SwiftUI 示例

d3-rest-combine-swift-example

文档(API)