Swift Platforms Swift Package Manager License

HTTPRequestable

一个轻量级的 WebService API,适用于 Apple 设备,使用 Swift 5.x 编写,并使用 结构化并发。它构建于 HTTPTypes 库之上,该库由 Apple 提供。

入门

将以下依赖项子句添加到您的 Package.swift

// swift-tools-version:5.10
import PackageDescription

let package = Package(
  name: "MyApp",
  platforms: [.iOS(.v16), .tvOS(.v16), .macOS(.v12), .watchOS(.v9), .macCatalyst(.v16), .visionOS(.v1)],
  products: [
    .executable(name: "MyApp", targets: ["MyApp"])
  ],
  dependencies: [
    .package(url: "https://github.com/wmalloc/HTTPRequestable.git", from: "0.10.1")
  ],
  targets: [
    .target(name: "MyApp", dependencies: 
      [.product(name: "HTTPRequestable", package: "HTTPRequestable")])
  ]
)

特性

协议 特性
HTTPRequstable 定义您的请求
HTTPTransferable 创建您的 API 客户端

用法

创建 API

class HackerNews: HTTPTransferable, @unchecked Sendable {
  var requestInterceptors: [any RequestInterceptor] = []
  var responseInterceptors: [any ResponseInterceptor] = []

  let session: URLSession

  required init(session: URLSession = .shared) {
    self.session = session
    let logger = LoggerInterceptor()
    requestInterceptors.append(logger)
    responseInterceptors.append(logger)
  }

 func storyList(type: String) async throws -> StoryList.ResultType {
    let request = try StoryListRequest(environment: environment, storyType: type)
    return try await object(for: request, delegate: nil).value ?? []
  }
}

定义一个请求

struct StoryListRequest: HTTPRequestable {
  typealias ResultType = [Int]
  
  let environment: HTTPEnvironment
  let headerFields: HTTPFields? = .init([.accept(.json)])
  let queryItems: [URLQueryItem]? = [URLQueryItem(name: "print", value: "pretty")]
  let path: String?
  
  var responseDataTransformer: Transformer<Data, ResultType>? {
    Self.jsonDecoder
  }
  
  init(environment: HTTPEnvironment, storyType: String) throws {
    precondition(!storyType.isEmpty, "Story type cannot be empty")
    self.environment = environment
    self.path = "/\(storyType).json"
  }
}

然后您可以创建并实例化您的 API 对象以进行调用

var api = HackerNews()
let topStories = try await api.storyList(type: "topstories.json")

许可证

HTTPRequestable 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。

支持

如果您想支持这个项目,请考虑捐赠。
比特币: bc1qzxs3wk29vfxlr9e4frq9cdmgkvrp62m5xhm93l
以太坊: 0xa824353280d2A0F32b2d258904509EFAEaE6603d